检查 "isDefined" 并映射到 "get"

check "isDefined" and map to "get" together

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

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

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

只需使用collect:

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

collect 地图和过滤器一步到位。

假设 myOptionListList[Option[T]] 对于某些 T 你可以使用 flatten:

val values = myOptionList.flatten

你有几个选择。最简单的大概是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!