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

时间:2016-02-09 21:35:02

标签: scala optional

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

假设我们有以下列表

val list: List[(A, Option[B])] = // Initialization stuff

我们希望将转化应用于list以获取以下列表

val transformed: List[(B, A)]

适用于评估为Option[B]的所有Some[B]。我发现这样做的最好方法是应用以下转换链:

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

然而我觉得我错过了一些东西。哪个是处理Option[T]的最佳方式?

1 个答案:

答案 0 :(得分:13)

您可以使用collect

val transformed = list.collect {
  case (a, Some(b)) => (b, a)
}

收集,如文档中所定义:

  

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

含义,它只为符合部分函数中定义的任何情况的元素生成结果。我想将其视为合并filtermap