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