在Scala中的类选项列表中匹配的子类

时间:2014-07-07 14:04:57

标签: scala

我有一个列表: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]]

3 个答案:

答案 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