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を学ぶ人向けに。