2017-07-19 1 views
1

Warum ändert sich das, wenn ich auf das Ergebnis eines MapValues ​​zugreife? Sollte es nicht unveränderlich sein.Warum ändert Map.mapValues ​​die Antwort?

Betrachten Sie die folgende Ammonitesitzung.

[email protected] import scala.util.Random 
import scala.util.Random 
[email protected] Seq("a").map(_ => Random.nextInt) 
res1: Seq[Int] = List(1035918980) 
[email protected] res1 
res2: Seq[Int] = List(1035918980) 
// re accessing Seq.map doesnt change 
[email protected] Map("a" -> "a").mapValues(_ => Random.nextInt()) 
res3: Map[String, Int] = Map("a" -> 653125272) 
[email protected] res3 
res4: Map[String, Int] = Map("a" -> -694232910) 
// re accessing Map.mapValues changes 

Antwort

1

Gemäß the Scaladoc gibt mapValues eine Ansicht zurück, die die Originalsammlung umhüllt, anstatt die (transformierten) Daten zu kopieren. Da dies nur eine Ansicht und keine eigenständige Sammlung ist, muss sie bei jedem Zugriff neu bewertet werden.

Dies ist anders als beispielsweise map, wobei the scaladoc die Rückgabe einer neuen Sammlung angibt und nicht nur eine Ansicht, die auf das Original verweist.

1

mapValues gibt eine Ansicht der Karte. Die Wertetransformation wird jedes Mal beim Zugriff angewendet, nicht im Speicher.

Verwandte Themen