オプション[x]のScalaコレクションをxのコレクションに変換する方法
-
12-10-2019 - |
質問
私はScalaを探索し始めていますが、私が興味を持っていることの1つは 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))
所属していません StackOverflow