程序的功能
针对某目录下的的所有文件的单词进行汇总,并进行词频统计。
简单解释一下程序:
1、首先引入java.io.File对象,因为要遍历某个目录下的整个文件...引入两个包
2、单例对象,不需要声明类,入口函数不返回任何值 ,函数体。
声明file对象,帮忙获取当前目录下的文件,
files,获取多个文件,打印名称(不写也行),再将files转换为listFiles文件列表,列表中每一个元素都是一个文件,方便后续的遍历
wordsMap,进行单词的词频统计,例如 hadoop : 5,单词数量是可变映射,
如何声明可变映射呢?我们没导入包,直接把类全称写进来了,加了scala.collection.mutable.Map[String,Int](),映射中包含两个类型,因为映射的key是单词为String类型,而单词出现的频次为Int类型。
listFiles.foreach( ),然后依次对文件遍历,把他里面的文件拿出来,拿到文件后,对文件中一行行的单词读出来。
.foreach需要遍历每一个文件。对这个文件file做操作需要一个函数,遍历得到的每一个值都要赋值个file,
它的整个函数体如下红框:
=> 右边做的是对文件file做的操作,即把file一行行读出来形成一个集合,对文件集合再调用foreach方法, .foreach(line => line.split(" ")拆分成单词,再把单词按照词频统计放到映射里,如果存在就加一...... .foreach(line => line.split(" ") .....)集合中每一个值都赋值给我们的line,然后lambda表达式中 => 右边就是对line的具体操作--对line按空格进行拆分,这样每一行都会出现许多个单词,多个单词会构成另一个集合。
对多个单词组成的集合,我们再调用.foreach(word => {if (wordsMap.contains(word)){ wordsMap(word) += 1} else{ wordsMap += (word -> 1)}})
对取到的每一个word,例如取到一个hadoop,如果这里面包含hadoop,那么他的键值对的值加一,如果不包含,就新建一个键值对。
下面的
代码实现定制的打印
以上就是Scala的函数式编程。