Frage

Ich fange Scala zu erkunden, und eines der Dinge, die ich von fasziniert bin ist die Option Art und das Versprechen der Lage zu sein null Fehler zu beseitigen.

Allerdings habe ich nicht in der Lage, herauszufinden, wie eine Liste zu transformieren (oder eine andere Sammlung) von, sagen wir, Option[String], eine Sammlung von String (natürlich alle Werte herausgefiltert werden, die None sind).

Mit anderen Worten: Wie komme ich von dieser:

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

... folgt aus:

List[Int] = List(1)

Ich bin mit Scala 2.8, ob das einen Einfluss auf die Antwort hat.

War es hilfreich?

Lösung

val list1 = List(Some(1), None, Some(2))
val list2 = list1.flatten // will be: List(1,2)

Andere Tipps

Für pädagogische Zwecke, könnten Sie einige Alternativen mögen:

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)

Mit Scalaz können Sie eine etwas andere Operation ausführen genannt sequence, dass die Renditen 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))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top