2011-01-19 4 views
68

Scalaを勉強し始めました。私が興味をそそられるものの1つはOptionタイプで、nullに関連するエラーを取り除くことができるという약속です。 。 StringのコレクションにOption[String]、たとえば、の私はリスト(またはその他のコレクション)を形質転換する方法を考え出すことができませんでしたがオプションの[X]コレクションのコレクションをXのコレクションに変換する方法

、(明らかにNoneある任意の値を除外)。言い換えれば

、どのように私はこのから入手できます:

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

...これに:

List[Int] = List(1) 

それが答えに影響を持っている場合、私はScalaの2.8を使用しています。教育目的のために

答えて

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

(私が望むように)恥ずかしがらず簡単です!ありがとう。 – npad

+7

オプション[A]からGenTraversableOnce [A] – kosii

+0

@kosiiへの暗黙的な変換があるためにのみ動作することに注意してください。(スカラ2.11.6以上で)オプション[A]からイテラブル[A] –

53

、あなたには、いくつかの選択肢を好むかもしれない:Scalazで

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) 

を、あなたはOption[List[Int]]を返しsequenceと呼ばれるわずかに異なる操作を行うことができます。

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)) 
関連する問題