在 Scala 中两个函数的区别,foreach 不能累积外部 Map



我是一个新学习者,我想计算文件中不同单词的数量。

这工作正常

val filePath = "C:\Users\76274\Desktop\yaml.txt"
def exercise2(file:String): HashMap[String,Int] ={
Source.fromFile(file).getLines().foldLeft(HashMap[String,Int]())(
(result,str) =>
str.split("\W+").foldLeft(result)(
(result,word) => result + (word.toLowerCase -> (result.getOrElse(word.toLowerCase,0) + 1)))) 
}

这将返回一个空的地图

val filePath = "C:\Users\76274\Desktop\yaml.txt"
def exercise2(file:String): HashMap[String,Int] ={
Source.fromFile(file).getLines().foldLeft(HashMap[String,Int]()){
(result,str) => {
str.split("\W+").foreach(word => {
result + (word.toLowerCase -> (result.getOrElse(word.toLowerCase,0) + 1))
println(result)
})}
result
}
}

我不知道为什么后面的不起作用。作为一个Java程序员,我认为它也应该工作得很好。我希望你能解释一下,谢谢!

第二个方法不起作用的原因是因为+方法并没有真正向 Map 添加元素,而是创建一个新Map,添加/更新给定元素 - scaladoc。

如果你想让第二个使用MUTABLE映射工作,你可以使用+=方法-scaladoc。顺便说一句,如果您要寻求可变解决方案,我也不会费心在第一级使用 fold,而是使用另一个 foreach。

但是,在 Scala 中,我们更喜欢不可变的,这就是为什么我们会选择第一个带有不可变映射

的映射。PS:与此无关,但除非您真的需要它成为HashMap,否则更喜欢Map特征(默认情况下是不可变的(scala.collection.mutable.Map(可变的(。另外,要创建一个空集合,更常见的是调用empty方法,而不是空的应用()。例如Map.empty[String, Int].

最新更新