Scala 勾选“;定义为;并映射到;获得;在一起

Scala 勾选“;定义为;并映射到;获得;在一起,scala,scala-collections,Scala,Scala Collections,如何更有效地执行以下操作: myoptionList.filter(_.isDefined).map(_.get) 这将需要两次迭代时间,有没有更好的方法呢?只需使用collect: myOptionList.collect { case Some(x) => x } 一步收集贴图和过滤器。假设myOptionList是一个列表[选项[T]]对于一些T您可以使用展平: val values = myOptionList.flatten 你有两个选择。最简单的方法可能是展平。由于选

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

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

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

只需使用
collect

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

一步收集贴图和过滤器。

假设
myOptionList
是一个
列表[选项[T]]
对于一些
T
您可以使用
展平

val values = myOptionList.flatten

你有两个选择。最简单的方法可能是展平。由于
选项
可以隐式转换为
可编辑
,因此可以
展平
选项列表
,方法与列表列表大致相同:

myOptionList.flatten
您也可以以大致相同的方式使用
flatMap
。以下是一些选项:

myOptionList.flatMap(x => x)
myOptionList.flatMap(identity(_))
myOptionList.flatMap(Option.option2Iterable)
myOptionList.flatMap[Int,List[Int]](identity)
您也可以使用
收集
collect
PartialFunction
作为参数。如果找到匹配项,则根据函数映射该值。否则它会被过滤掉。因此,在这里,您可以只匹配
一些(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
}
我还想提到的是,一般来说,当您的复杂逻辑需要对一个列表执行多个操作,但您不想多次遍历该列表时,可以使用
查看

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

对于许多这样的情况,您是对的,而不是
(x=>x)
更常用的
myOptionList.flatMap(identity)
@Yury,但我认为在
选项列表中这不起作用,因为只有在拼写lambda时,类型推断才起作用