我开始探索 Scala,我感兴趣的一件事Option
是能够消除null
相关错误的类型和承诺。
但是,我无法弄清楚如何将 的列表(或其他集合)转换为(显然过滤掉任何值为)Option[String]
的集合。String
None
换句话说,我如何从中得到:
List[Option[Int]] = List(Some(1))
...对此:
List[Int] = List(1)
如果这对答案有任何影响,我正在使用 Scala 2.8。
我开始探索 Scala,我感兴趣的一件事Option
是能够消除null
相关错误的类型和承诺。
但是,我无法弄清楚如何将 的列表(或其他集合)转换为(显然过滤掉任何值为)Option[String]
的集合。String
None
换句话说,我如何从中得到:
List[Option[Int]] = List(Some(1))
...对此:
List[Int] = List(1)
如果这对答案有任何影响,我正在使用 Scala 2.8。
val list1 = List(Some(1), None, Some(2))
val list2 = list1.flatten // will be: List(1,2)
出于教育目的,您可能需要一些替代方案:
scala> val list1 = List(Some(1), None, Some(2))
list1: List[Option[Int]] = List(Some(1), None, Some(2))
scala> list1 flatten
res0: List[Int] = List(1, 2)
// Expanded to show the implicit parameter
scala> list1.flatten(Option.option2Iterable)
res1: List[Int] = List(1, 2)
scala> list1 flatMap (x => x)
res2: List[Int] = List(1, 2)
scala> list1 flatMap Option.option2Iterable
res3: List[Int] = List(1, 2)
// collect is a simultaneous map + filter
scala> list1 collect { case Some(x) => x }
res4: List[Int] = List(1, 2)
使用 Scalaz,您可以执行一个稍微不同的操作,称为sequence
,它返回Option[List[Int]]
。
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
scala> val list1: List[Option[Int]] = List(Some(1), None, Some(2))
list1: List[Option[Int]] = List(Some(1), None, Some(2))
scala> list1.sequence
res1: Option[List[Int]] = None
scala> val list2: List[Option[Int]] = List(Some(1), Some(2))
list2: List[Option[Int]] = List(Some(1), Some(2))
scala> list2.sequence
res2: Option[List[Int]] = Some(List(1, 2))