immutable.Map インスタンスの getOrElseUpdate の慣用的な方法は何ですか? 以下のスニペットを使用しますが、冗長で非効率的です
var map = Map[Key, Value]()
def foo(key: Key) = {
val value = map.getOrElse(key, new Value)
map += key -> value
value
}
immutable.Map インスタンスの getOrElseUpdate の慣用的な方法は何ですか? 以下のスニペットを使用しますが、冗長で非効率的です
var map = Map[Key, Value]()
def foo(key: Key) = {
val value = map.getOrElse(key, new Value)
map += key -> value
value
}
私はおそらく次のgetOrElseUpdated
ような方法を実装します:
def getOrElseUpdated[K, V](m: Map[K, V], key: K, op: => V): (Map[K, V], V) =
m.get(key) match {
case Some(value) => (m, value)
case None => val newval = op; (m.updated(key, newval), newval)
}
m
のマッピングがある場合は元のマップを返すか、マッピングが追加されkey
た別のマップを返します。key -> op
このメソッドの定義は of に似てgetOrElseUpdate
いmutable.Map
ます。
あなたの問題を要約しましょう:
var
したがって、署名は次のようにする必要があります
def getOrElseUpdate(key: K): Tuple2[V, Map[K,V]]
//... use it like
val (v, m2) = getOrElseUpdate(k)
map = m2
また
def getOrElseUpdate(key: K, setter: (Map[K,V]) => Unit): V
//... use it like
val v = getOrElseUpdate(k, map = _)
これらのソリューションのいずれかを使用できる場合は、暗黙的な変換を使用して独自のバージョンを追加できますが、署名だけで判断すると、これらのいずれも標準ライブラリにないと思います。
そのような方法はありません-マップの値を取得するときのマップの突然変異(更新)は副作用です(これはプログラミングの不変性/関数型スタイルと矛盾します)。
デフォルト値で新しい不変マップを作成する場合、指定されたキーの別の値が存在しない場合は、次の操作を実行できます。
map + (key -> map.getOrElse(key, new Value))
使用しないのはなぜですか、withDefault
またはwithDefaultValue
不変のマップがある場合は?