选中"isDefined"并一起映射到"get"



如何更有效地执行以下操作:

myoptionList.filter(_.isDefined).map(_.get)

这将需要两次迭代时间,有更好的方法吗?

您有几个选项。最简单的可能是flatten。由于Option可以隐式转换为Iterable,因此您可以用与列表列表大致相同的方式flatten Options列表:

myOptionList.flatten

您也可以以大致相同的方式使用flatMap。这里有几个选项:

myOptionList.flatMap(x => x)
myOptionList.flatMap(identity(_))
myOptionList.flatMap(Option.option2Iterable)
myOptionList.flatMap[Int,List[Int]](identity)

您也可以使用collectcollectPartialFunction作为自变量。如果找到匹配项,则根据函数映射该值。否则会被过滤掉。因此,在这里,您可以只匹配Some(x)并映射到x(这样所有的Nones都会被过滤掉)。这个选项是最通用的,如果你愿意,它将允许你应用更精细的逻辑。

myOptionList.collect { case Some(x) => x }
//Example of more complex logic:
myOptionList.collect {
    case Some(x) if x % 2 == 0 => x / 2
}

我还想提到的是,通常情况下,当您有复杂的逻辑,需要对列表执行多个操作,但不想多次遍历列表时,可以使用view:

myOptionList.view.filter(_.isDefined).map(_.get) //Will only traverse list once!

假设myOptionList是某些TList[Option[T]],则可以使用flatten:

val values = myOptionList.flatten

只需使用collect:

myOptionList.collect {
  case Some(x) => x
}

CCD_ 19在一个步骤中既映射又过滤。

最新更新