如何将选项的Scala集合转换为X的集合
我正在开始探索Scala,我感兴趣的事情之一是Optiontypes和能够消除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) 
为了教育目的,你可能会喜欢一些替代scheme:
 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))