2017-01-11 4 views
1

У меня есть этот пример, который использует изменчивый HashMap.withDefaultValue. withDefaultValues предоставляет способ вернуть значение, даже если ключ не существует, но он не должен изменять коллекцию. в любом случае, существует противоречивое поведение, так как map.size возвращает 0, и в то же время map(key) возвращает значение.scala mutable Map withDefaultValue странное поведение

как это возможно?

import scala.collection.mutable 

val map = mutable.HashMap[String, mutable.Map[Int, String]]() 
      .withDefaultValue(mutable.HashMap[Int, String]()) 

map("id1")(2) = "three" 
println(map.size)  // 0     (expected) 
println(map)    // Map()    (expected) 
println(map("id1"))  // Map(2 -> three)  (unexpected) 
println(map("id1")(2)) // three    (unexpected) 
+0

Как это неожиданно? 'map (" id1 ")' использует значение по умолчанию, которое вы указали. –

+0

Вам действительно нужна изменчивая «Карта»? Я бы рекомендовал неизменяемую карту или «TrieMap», если вам нужна изменчивость в параллельном контексте. – Reactormonk

+0

Я предоставил пустое значение по умолчанию (аргумент withDefaultValue). –

ответ

2

Можно вынесем defaultValue, потому что он передается как значение.

import scala.collection.mutable 

val defaultValue = mutable.HashMap[Int, String]() 
val map = mutable.HashMap[String, mutable.Map[Int, String]]() 
      .withDefaultValue(defaultValue) 

map("id1")(2) = "three" 

Который дает

println(defaultValue) // Map(2 -> three) 

... который должен объяснить остальную часть поведения. И именно поэтому я рекомендую неизменные структуры данных ;-)

Смежные вопросы