/ / Jak uniknąć używania zmiennej var podczas wykonywania wielu zamian łańcucha w łańcuchu - scala

Jak uniknąć używania var podczas wykonywania wielu zamiany ciągów znaków w ciągu znaków - scala

Oto, co próbowałem:

def doStringReplcements(originalStr: String, replacementsMap: Map[String,String]): String = {
var newStr = originalStr
replacementsMap.foreach { pair =>
newStr = newStr.replaceAllLiterally(pair._1, pair._2)
}
newStr
}

Ale funkcjonalny styl programowania zaleca unikanie zmiennych, więc jak to zrobić za pomocą samych zmiennych?

Odpowiedzi:

4 dla odpowiedzi № 1

Rozważ użycie foldLeft funkcja na mapie.

na przykład

replacementsMap.foldLeft(originalStr){ case (accumulator, (target, replacement)) =>
accumulator.replaceAllLiterally(target, replacement)
}

2 dla odpowiedzi nr 2

Zastanów się nad wyrażeniem regularnym:

scala> import util.matching.Regex
import util.matching.Regex

scala> val text = "one in hand, two in bush"
text: String = one in hand, two in bush

scala> val reps = Map("one"->"lots","two"->"more")
reps: scala.collection.immutable.Map[String,String] = Map(one -> lots, two -> more)

scala> val r = reps.keys.mkString("|").r
r: scala.util.matching.Regex = one|two

scala> r.replaceAllIn(text, m=>reps(m.matched))
res0: String = lots in hand, more in bush