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

时间:2014-06-05 10:40:44

标签: scala foreach

我有Map个以下示例内容:

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

和以下方法:

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

该方法应将key中找到的所有text替换为replacements中指定的值。

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

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

1 个答案:

答案 0 :(得分:5)

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

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

或者是较短的版本:

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

要解释一下,如果您不熟悉,fold 完全正在迭代集合并构建或更新累积值的功能模式。它从前一个值和当前项获取初始值和函数到下一个值,并返回最终值。 leftright变体只是指您是否向后或向前折叠序列,这可能会在性能和结果方面产生差异,具体取决于您的数据结构和数据结构的性质。你传递的功能。

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