foldLeft
Hier haben Sie eine Schleife.
Die unveränderliche Version der Schleife mit Seiteneffekten ist foldLeft
mit allen Seiteneffekten, die durch die Erstellung des nächsten Zustands ersetzt wurden:
val result = mapVal.foldLeft(str){case (state, (key, value)) =>
state.replaceAll(/*ein Muster, das den Schlüssel betrifft*/, value)
}
Um in einer unveränderlichen Umgebung zu arbeiten, sollte jede Iteration der Schleife einen Wert zurückgeben und den Resultat der vorherigen Iteration als Parameter entgegennehmen. Genau das ist foldLeft
.
Rekursion
Die andere Lösung ist eine rekursive Methode. Sie sollten die Schleifeniteration in eine Methode extrahieren und diese Methode zur Aufruf der nächsten Iteration am Ende machen:
def function123(str: String, mapVal: Map[String, String]) = {
@tailrec def loop(state: String, pairs: List[(String, String)]): String = pairs match {
case Nil => state
case (key, value) :: tail =>
val nextState = state.replaceAll(/*ein Muster, das den Schlüssel betrifft*/, value)
loop(nextState, tail)
}
loop(str, mapVal.toList)
}
Veränderliche Schleife -> unveränderlich
Um Code mit einer veränderlichen Schleife unveränderlich zu machen, sollten Sie alle Werte, die implizit in Änderungen innerhalb der Schleife involviert sind, in irgendeiner Art von Zustand extrahieren (einziger Zustandsobjekt für foldLeft
oder Bündel von Parametern für rekursive Methode) und dann am Ende jeder Iteration einen neuen Zustand basierend auf dem vorherigen erzeugen.