私が持っているとしましょう
import scala.collection.immutable.TreeMap
val tree = new TreeMap[String, List[String]]
上記の宣言の後、キー "k1" を List("foo", "bar") に割り当て、キー "k1" を取得または読み取り、存在しないキー "k2" を読み取るにはどうすればよいですか?
存在しないキー "k2" を読み取ろうとするとどうなりますか?
不変マップを「変更」する最良の方法は、(varではなくval)変数で参照することです。
var tree = TreeMap.empty[String, List[String]]
tree += ("k1" -> List("foo", "bar")) //a += b is sugar for "c = a + b; a = c"
メソッドを使用して直接アクセスできますapply。ここでは、scala 構文糖衣が作動するため、括弧を使用してアクセスするだけです。
val l = tree("k1") //equivalent to tree.apply("k1")
MatchErrorただし、メソッドがis the key is not presentをスローするため、このようなマップにアクセスすることはめったにありません。get代わりに使用してください。これは、値の型である場所を返しますOption[V]。V
val l = tree.get("k1") //returns Option[List[String]] = Some(List("foo", "bar"))
val m = tree.get("k2") //returns Option[List[String]] = None
この場合、存在しないキーに対して返される値は ですNone。オプションの結果で何ができますか? map、flatMap、filter、collectおよびのメソッドを利用できますgetOrElse。それに対するパターンマッチングや、Option.getメソッドを直接使用することは避けてください!
例えば:
val wordLen : List[Int] = tree.get("k1").map(l => l.map(_.length)) getOrElse Nil
EDIT : Map を として宣言せずに構築する方法の 1 つはvar、別のコレクションを変換してこれを行うと仮定すると、折り畳みを介して行うことです。例えば:
//coll is some collection class CC[A]
//f : A => (K, V)
val m = (TreeMap.empty[K, V] /: coll) { (tree, c) => tree + f(c) }
これは、ユースケースでは不可能な場合があります