なしをリストから除外する方法[オプション]?


105

私が持っている場合はList[Option[A]]Scalaで、フィルタリングするための慣用的な方法何であるNoneの値は?

1つの方法は、以下を使用することです。

val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye"))
someList.filter(_ != None)

もっと「慣用的な」方法はありますか?これはかなり簡単に見えます。


回答:


161

同時にオプションを取り除きたい場合は、以下を使用できますflatten

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)

23
私は追加するflatMap以外のリスト要素を処理するために使用することができますNoneに似たのを、someList.flatten.map1は、多くの場合、これらの要素だけでなく、で動作するように望んでいるとして、flatten楽しみのうちリスト。
フランク

はい、私はRaphに、フィルターされたリストで何をするつもりかを尋ねることをためらいました。しかし、フラット化したいシナリオもたくさんあります。
Nicolas

Optionオブジェクトのコンテンツを取得したい場合もあれば、そのままにしておく必要がある場合もありますOption[A]。私はますます多くの用途を見つけていますOption[A]-クールな機能。
ラルフ

同等のflatForeachタイプのメソッドはありますか?
cdmckay 2015年

1
コレクションが不変である場合、faltmapが役立ちます。コレクションが変更可能な場合、いいえ、ありません。
Nicolas


2

catsまた有するライブラリflattenOptionオン、任意F[Option[A]]F[A](ここF[_]FunctorFilter

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.