değişmez harita (val
karşı var
) bir değişkende kendisine atıfta olan "mutasyona" en iyi yolu:
var tree = TreeMap.empty[String, List[String]]
tree += ("k1" -> List("foo", "bar")) //a += b is sugar for "c = a + b; a = c"
doğrudan, burada apply
yöntemi kullanılarak erişilebilir böylece de scala sözdizimsel şeker tekmeler kullanmakta parens erişmek sadece edebilirsiniz: yöntem MatchError
atacağım çünkü nadiren böyle haritalar erişmek, ancak
val l = tree("k1") //equivalent to tree.apply("k1")
ke olduğunu y mevcut değil. Bu durumda
val l = tree.get("k1") //returns Option[List[String]] = Some(List("foo", "bar"))
val m = tree.get("k2") //returns Option[List[String]] = None
, eksik bir anahtar için döndürülen değer None
olup: V
değer-tipi olduğu bir Option[V]
döndürür, bunun yerine get
kullanın. isteğe bağlı sonucuyla ne yapabilirim? Peki, map
, flatMap
, filter
, collect
ve getOrElse
yöntemlerinden yararlanabilirsiniz. Desen eşlemesini deneyin ve önleyin ya da Option.get
yöntemini doğrudan kullanın!
val wordLen : List[Int] = tree.get("k1").map(l => l.map(_.length)) getOrElse Nil
DÜZENLEME: Örneğin
bir var
olarak açıklanmadan bir harita bina ve bazı ayrı toplama dönüştürerek yapıyoruz varsayarak tek yön, yapmaktır bir katla. Örneğin:
//coll is some collection class CC[A]
//f : A => (K, V)
val m = (TreeMap.empty[K, V] /: coll) { (tree, c) => tree + f(c) }
Bu kullanım örneği için mümkün olmayabilir
Scala içinde
AFAIK val biz val için işaret ettiği nesnenin referansını değiştiremezsiniz ama biz nesnede değerlerini değiştirmek anlamına gelir . Dolayısıyla, daha yüksek performanslı bir çözüm, valide dayanır ve yukarıdaki durumda var değildir. – ace
@amc - sadece değiştirilebilir bir yapı daha yüksek performans sunuyorsa, bu (tabii ki) olmayabilir. Ayrıca, tek bir çağrı daha performanslı olsa bile, diğer gereksinimler (örneğin, programı programın başka bir bölümüne güvenli bir şekilde iletme) bununla çatışabilir - örneğin, genellikle bir dönüştürülebilir yapının ** kopyasını ** almak zorunda kalabilirsiniz. . Ayrıca, scala standart kütüphanesinde herhangi bir “TreeMap” öğesi bulunmadığına işaret etmek de önemlidir. –
Kodunuz için teşekkür ederiz, ancak ağacın değerini val olarak değil de varken değiştirmenin bir yolu var mı? – ace