检查 "isDefined" 并映射到 "get"
check "isDefined" and map to "get" together
如何更有效地执行以下操作:
myoptionList.filter(_.isDefined).map(_.get)
这需要两次迭代时间,有没有更好的方法?
只需使用collect
:
myOptionList.collect {
case Some(x) => x
}
collect
地图和过滤器一步到位。
假设 myOptionList
是 List[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)
您也可以使用 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.filter(_.isDefined).map(_.get)
这需要两次迭代时间,有没有更好的方法?
只需使用collect
:
myOptionList.collect {
case Some(x) => x
}
collect
地图和过滤器一步到位。
假设 myOptionList
是 List[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)
您也可以使用 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!