如何修改foreach循环中的变量?

Chr*_*St. 1 foreach scala

我有Map以下示例内容:

var replacements: Map[String, String] = Map("a" -> "1", "b" -> "2", "c" -> "3")
Run Code Online (Sandbox Code Playgroud)

以及以下方法:

def censor(text: String, replacements: Map[String, String]): String = {
  replacements.keys.foreach(key => text = text.replace(key, replacements(key)))
  return text
}
Run Code Online (Sandbox Code Playgroud)

该方法应该用其赋值的值替换所有key找到的s .textreplacements

问题是循环text = text.replace(key, replacements(key))内的命令foreach.

所以我的问题是:如何修改循环text内的变量foreach

小智 5

foreach实际上并不是完成你想要的东西的正确工具.它不起作用的原因是方法参数不是变量,而是scala中的不可变值.你可以使用a var,但这不是Scala中的首选方式.相反,您可以折叠替换并将原始文本作为起始值:

def censor(text: String, replacements: Map[String, String]): String = {
  replacements.foldLeft(text){ case (text, (key, replacement)) => text.replace(key, replacement)}
}
Run Code Online (Sandbox Code Playgroud)

或者是较短的版本:

def censor(text: String, replacements: Map[String, String]): String = {
  replacements.foldLeft(text)((t, r) => t.replace(r._1, r._2))
}
Run Code Online (Sandbox Code Playgroud)

为了解释,如果你不熟悉,fold准确收集和建筑物或者你去更新一个累积值的迭代的功能格局.它从前一个值和当前项获取初始值和函数到下一个值,并返回最终值.这些leftright变体只是指你是否向后或向前折叠你的序列,这可能会在性能和结果方面产生差异,这取决于你的数据结构和你传递的函数的性质.

另见:http://www.scala-lang.org/api/2.11.1/index.html#scala.collection.Seq