(val
とは対照的にvar
)不変マップ変数にを参照している「突然変異」するための最良の方法:
var tree = TreeMap.empty[String, List[String]]
tree += ("k1" -> List("foo", "bar")) //a += b is sugar for "c = a + b; a = c"
それは、apply
方法を使用して直接アクセスすることができ
val l = tree("k1") //equivalent to tree.apply("k1")
方法はMatchError
はKEでスローされますので、しかし、私はめったにこのようなマップにアクセスしていない:あなたは括弧を使用して、単にアクセスすることができますでのScalaのシンタックスシュガーキックyは存在しません。この場合
val l = tree.get("k1") //returns Option[List[String]] = Some(List("foo", "bar"))
val m = tree.get("k2") //returns Option[List[String]] = None
、存在しないキーの戻り値はNone
ある:V
が値型であるOption[V]
を返す代わりに、get
を使用します。 のオプションの結果はどうすればよいですか?メソッドmap
、flatMap
、filter
、collect
、およびgetOrElse
を利用できます。試してパターンマッチングを避けるか、直接Option.get
メソッドを使用してください!例えば
:
val wordLen : List[Int] = tree.get("k1").map(l => l.map(_.length)) getOrElse Nil
EDIT:var
としてそれを宣言せずに地図を構築し、あなたには、いくつかの分別収集を変換することによりこれをやっていると仮定するとの一つの方法は、実行することですそれは折り目を介して。たとえば:
//coll is some collection class CC[A]
//f : A => (K, V)
val m = (TreeMap.empty[K, V] /: coll) { (tree, c) => tree + f(c) }
これはScalaでご利用の場合
私の知る限りvalのために可能ではないかもしれないが、我々はvalが指しているオブジェクトへの参照を変更することはできませんが、我々は、オブジェクトの値を変更できることを意味します。したがって、より高性能なソリューションはvalに基づいており、上記の場合はvarではありません。 – ace
@amc - 変更可能な構造が高性能を提供する場合にのみ、(もちろん)そうではない可能性があります。また、一回の呼び出しがより効果的であっても、他の必要条件(例えば、コレクションをプログラムの別の部分に安全に渡すなど)は、これと競合する可能性があります。例えば、可変構造の**コピー**を頻繁に取らなければならない。スカラ標準ライブラリには変更可能な 'TreeMap'がないことを指摘する価値もあります。 –
あなたのコードをありがとうございますが、varとしてではなく、varとしてツリーを維持しながらそれを行う方法はありますか? – ace