如何更有效地执行以下操作:
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)
您也可以使用collect
。collect
以PartialFunction
作为自变量。如果找到匹配项,则根据函数映射该值。否则会被过滤掉。因此,在这里,您可以只匹配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
是某些T
的List[Option[T]]
,则可以使用flatten
:
val values = myOptionList.flatten
只需使用collect
:
myOptionList.collect {
case Some(x) => x
}
CCD_ 19在一个步骤中既映射又过滤。