我有一个列表:List [Option [ParentClass]]。
case class ParentClass
case class ChildClassA
case class ChildClassB
在该列表中找到ChildClassB类型的项目有什么好方法。我有类似的东西,这不是一个很好的方法。
def childClassB: Option[ChildClassB] = connections.find(
_.get.name == "ChildClassB" ).flatten.asInstanceOf[Option[ChildClassB]]
答案 0 :(得分:5)
您可以使用collectFirst
查找与PartialFunction
匹配的第一个元素。在这种情况下,匹配子类的第一个元素:
class ParentClass
case class ChildClassA extends ParentClass
case class ChildClassB extends ParentClass
val list: List[Option[ParentClass]] = List(Some(new ChildClassA), None, Some(new ChildClassB), Some(new ChildClassB))
list.flatten.collectFirst{ case b: ChildClassB => b }
res1: Option[ChildClassB] = Some(ChildClassB@7fc1a698)
请注意,ParentClass
不能是子类扩展它的案例类。
答案 1 :(得分:1)
您可以使用collectFirst
,它接受部分函数并返回匹配的第一个元素的Option
。在您的情况下,您的部分函数不需要修改参数,并且因为您只能匹配某些输入,所以您的输出可以是正确的类型而无需任何转换。另外,您可以使用相同的模式匹配来忽略None
s。
def childClassB(connections: List[Option[ParentClass]]): Option[ChildClassB] = {
connections.collectFirst { case Some(x: ChildClassB) => x }
}
答案 2 :(得分:0)
有关
class ParentClass
case class ChildClassA extends ParentClass
case class ChildClassB extends ParentClass
还可以使用以下选项查找ChildClassB
find
list.flatten.find { ele => ele.isInstanceOf[ChildClassB] }.get
dropWhile
//仅在列表中至少有一个元素为ChildClassB
时才有效
list.flatten.dropWhile { ele => !ele.isInstanceOf[ChildClassB] }.head
takeWhile
//仅在列表中至少有一个元素为ChildClassB
时才有效
list.flatten.takeWhile { ele => ele.isInstanceOf[ChildClassB] }.head