Scala 入门第三讲
主要内容
这一讲,主要讲解Scala的函数式编程。讲解内容主要包括:
函数在Scala中是一等公民 ,可以将函数赋值给一个变量,也可以将函数作为参数传递给另外一个函数。
接收函数作为参数,或者返回一个函数的函数都叫做高阶函数。
另外,还讲解了Scala中的闭包,函数柯里化等。
最后,讲解了Scala中集合上的map、reduce等操作。
作业
统计一个文件夹下面所有的单词出现的总次数
代码
package Programming_in_Scala
import java.io.File
import collection.mutable.ArrayBuffer
import scala.io.Source
/**
* Created by Takechiyo on 2016/1/4.
* WordCount Program
*/
object DT_2 {
/**
* 遍历目录 得到目录下所有文件的绝对路径
* @param file The file or directory needed to transverse.
* @param fileList All of the file's name in the directory.
*/
def walk(file: File, fileList: ArrayBuffer[String]): Unit ={
if (file.isFile()){
println(file.getAbsolutePath)
fileList += file.getAbsolutePath
}
else
file.listFiles().foreach(walk(_, fileList))
}
def reduceByKey[K](collection: Traversable[Tuple2[K, Int]]) = {
collection
.groupBy(_._1)
.map { case (group: K, traversable) => traversable.reduce{(a,b) => (a._1, a._2 + b._2)} }
}
def main(args: Array[String]) {
val directory = "D:\\temp"
val fileList = ArrayBuffer[String]()
walk(new File(directory), fileList)
//读取文件中的内容,并分词,生成(String, 1)
val result = fileList
.flatMap(Source.fromFile(_).getLines())
.flatMap(_.split(" "))
.map(item => (item, 1))
//统计目录下所有文件中每个单词出现的总次数
reduceByKey(result).foreach(println)
//统计目录下所有文件中单词的总个数
val count = result.map(_ => 1).reduce(_ + _)
println(count)
}
}