読者です 読者をやめる 読者になる 読者になる

OptionのListからMapへの変換

Optionを要素に持つListから、Someである要素だけについて何らかの処理をした結果をMapで返すにはどうするのがScalaらしいのだろう?

例えばこんな感じ?

scala> val ol = List(Some(1), None)
ol: List[Option[Int]] = List(Some(1), None)

scala> Map() ++ ol.flatMap { _ match {
     | case Some(i) => List( (i -> i*2) )
     | case None => List()
     | }}
res3: scala.collection.immutable.Map[Int,Int] = Map( (1,2) )

こんな風にするとイイよ!という書き方があったら誰か教えて〜。

追記(2011.2.14)

コメントでより良い書き方を教えて頂きました!

scala> val ol = List(Some(1), None)
ol: List[Option[Int]] = List(Some(1), None)

scala> ol.flatten.map(i => i -> i * 2).toMap
res0: scala.collection.immutable.Map[Int,Int] = Map( (1,2) )

scala> ol.collect{case Some(i) => i -> i * 2}.toMap
res1: scala.collection.immutable.Map[Int,Int] = Map( (1,2) )

こっちのが断然いい

Version Info