foldLeft
У вас есть цикл здесь.
Неизменной версия петли с побочными эффектами является foldLeft
со всеми побочными эффектами заменены следующим состоянием созданием:
val result = mapVal.foldLeft(str){case (state, (key, value)) =>
state.replaceAll(/*some pattern involving key*/, value)
}
Для работы в непреложной среде каждой итерация цикла должна возвращать значение и принимать результат предыдущих итерация как параметр. Это именно то, что foldLeft
.
рекурсии
Другим решением является рекурсивным методом. Вы должны извлечь итерации цикла к методу и сделать этот метод для вызова следующей итерации в конце:
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(/*some pattern involving key*/, value)
loop(nextState, tail)
}
loop(str, mapVal.toList)
}
Мутабельном петля -> неизменны
Для кода с изменяемым контуром неизменяемыми вы должны извлечь все значения, неявно участвующие в изменениях в цикле, в какое-то состояние (единый государственный объект для foldLeft
или набор параметров для рекурсивного метода), а затем создают новое состояние, основанное на предыдущем в конце каждой итерации.
Обычно вы делаете объекты неизменными, из ваших двух параметров строка уже неизменна и Map, вы можете копировать и возвращать новую карту каждый раз. – Sap