巧妙地处理Scala中的Option [T]

ric*_*din 5 scala optional

我正在使用Scala开发一些代码,我正在尝试巧妙地解决包含一些代码的集合之间的基本转换Option[T].

假设我们有以下列表

val list: List[(A, Option[B])] = // Initialization stuff
Run Code Online (Sandbox Code Playgroud)

我们想要应用转换list来获取以下列表

val transformed: List[(B, A)]
Run Code Online (Sandbox Code Playgroud)

对于所有Option[B]评价的人来说Some[B].我发现这样做的最好方法是应用以下转换链:

val transformed = 
  list.filter(_.isDefined)
      .map { case (a, Some(b)) => (b, a) }
Run Code Online (Sandbox Code Playgroud)

但是我觉得我错过了什么.处理Option[T]s 的最佳方法是哪种?

Zol*_*tán 13

你可以使用collect:

val transformed = list.collect {
  case (a, Some(b)) => (b, a)
}
Run Code Online (Sandbox Code Playgroud)

收集,如文档中所定义:

通过将部分函数应用于定义函数的此列表的所有元素来构建新集合.

意思是,它只为符合部分函数中定义的任何情况的元素生成结果.我喜欢将它视为一个组合filter而且map.