77

私は Scala を探求し始めています。私が興味をそそられていることの 1 つは、関連するエラーOptionを排除できる型と約束です。null

ただし、たとえば のリスト (または他のコレクション) を のコレクションに変換する方法を見つけることができませんでしたOption[String](String明らかに である値を除外しますNone)。

言い換えれば、これからどうやって得るのですか:

List[Option[Int]] = List(Some(1))

...これに:

List[Int] = List(1)

それが答えに影響を与える場合、私はScala 2.8を使用しています。

4

2 に答える 2

136
val list1 = List(Some(1), None, Some(2))
val list2 = list1.flatten // will be: List(1,2)
于 2011-01-19T01:28:56.490 に答える
58

教育目的のために、いくつかの代替案を好むかもしれません:

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)

sequenceScalaz では、 を返す、と呼ばれる少し異なる操作を実行できます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))
于 2011-01-19T07:18:09.957 に答える