35

少し検索しましたが、None の値を持つエントリをマップに除外する方法について、まだ良い答えが見つかりませんでした。次のようなマップがあるとします。

val map = Map[String, Option[Int]]("one" -> Some(1), 
                                   "two" -> Some(2), 
                                   "three" -> None)

("one", Some(1))との("two", Some(2))ペアだけでマップを返したいと思います。リストがある場合、これは flatten で行われることは理解していますが、キーと値に分割してからそれらを再結合しようとせずにマップで効果を達成する方法がわかりません。

4

3 に答える 3

58

値をフィルタリングしている場合は、同時に値をNone抽出して、次のようにすることもできます。SomeMap[String,Int]

scala> map.collect { case (key, Some(value)) => (key, value) }
res0: scala.collection.immutable.Map[String,Int] = Map(one -> 1, two -> 2)
于 2012-08-07T23:01:34.527 に答える
6

また map.filterKeys( map(_) != None)

また

for( (k,v) <- map if( v!= None)) yield (k,v)

このアプローチは、マップには存在しない一般的な filterValues メソッドを提供します。
代替手段はどれも完璧ではないので、私はそのような方法が恋しいです。

[後で更新] これは、各エントリのルックアップを行わず、適度に明確に読み取るより優れたバージョンです。

map.filter( {case (x,y)=> y!=None})

于 2013-11-19T20:05:56.833 に答える