巧妙地处理Scala中的选项[T]

巧妙地处理Scala中的选项[T],scala,optional,Scala,Optional,我正在使用Scala开发一些代码,并试图巧妙地解决包含一些选项[T]的集合之间的基本转换 假设我们有以下列表 val list: List[(A, Option[B])] = // Initialization stuff val transformed: List[(B, A)] 我们希望对list应用一个转换,以获得以下列表 val list: List[(A, Option[B])] = // Initialization stuff val transformed: List[(B

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

假设我们有以下列表

val list: List[(A, Option[B])] = // Initialization stuff
val transformed: List[(B, A)]
我们希望对
list
应用一个转换,以获得以下列表

val list: List[(A, Option[B])] = // Initialization stuff
val transformed: List[(B, A)]
对于所有计算结果为部分[B]的
选项[B]
。我发现最好的方法是应用以下转换链:

val transformed = 
  list.filter(_.isDefined)
      .map { case (a, Some(b)) => (b, a) }

然而,我觉得我错过了一些东西。处理
选项[T]
s的最佳方法是什么?

您可以使用
收集

val transformed = list.collect {
  case (a, Some(b)) => (b, a)
}
按照文档中的定义,收集:

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

也就是说,它只为匹配分部函数中定义的任何情况的元素生成结果。我喜欢把它看作是一个组合的
过滤器
映射