Как преобразовать коллекцию Scala Option[X] в коллекцию X
Я начинаю исследовать Scala, и одна из вещей, которые меня заинтриговали, - это Option
тип и обещание быть в состоянии устранить null
ошибки, связанные с.
однако я не смог решить, как преобразовать список (или другую коллекцию), скажем,Option[String]
, в коллекцию String
(очевидно, отфильтровывая любые значения, которые являются None
).
другими словами, как я могу получить от этого:
List[Option[Int]] = List(Some(1))
... к это:
List[Int] = List(1)
Я использую Scala 2.8, если это имеет какое-либо влияние на ответ.
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))