Option型のコレクションから Some(x) の値 x だけを取り出すには flatten
val opts: Seq[Option[Int]] = Seq(Some(2), None, Some(3))
のようなものから値のあるものだけを取り出して、
List(2, 3)
を作りたいときに、Scalaを覚えたての頃はやり方がよく分からなくて、最初にやっていたのが
opts.filter(_ != None).map(_.get)
だった。その後、Scalaがだいぶ書けるようになった頃に
for(Some(x) <- opts) yield x
やら、
opts.collect{ case Some(x) => x }
となり、最終的にたどり着いたのが
opts.flatten
である。標準ライブラリを理解してくると自然に行き着くことではあるのだが、 それにしても、このようなことは何故か誰も教えてくれない。初学者の頃にこれを書こうとする度に苦労したので、これからScalaを学ぶ人向けに。