内容:函数式编程
函数可以作为函数的返回值和参数
集合的函数式编程特别重要
1.函数可以复值给变量,函数名称+空格+下划线
def fun1(name:String){println(name)
val fun1_v=fun1 _
fun1_v("Spark") ,输出Spark
2.匿名函数
val fun2=(content:String)=>println(content)
fun2("Hadoop") ,输出Hadoop
3.高阶函数,是与java的最大区别
函数的参数是函数
val hiScala=(content:String)=>println(content)
def bigData(func:(String)=>Unit,content:String){func(content)}
bigData(hiScala,"Spark") ,输出Spark
val array=Array(1,2,3,4,5,6,7,8,9)
函数的返回值是函数
闭包,就是函数的变量超出函数作用域时,还可以对函数变量访问,因为scala自动为returned生成了一个func_Returned对象,带了content属性
def func_Returned(content:String)=(message:String)=>println(content+" "+message)
val returned=func_Returned("Spark")
returned("Scala") ,输出 Spark Scala
参数(类型)推断
valueAtOneQuarter((x: Double) => 3 * x) // 完整写法
valueAtOneQuarter((x) => 3 * x) // 已知参数类型,可以省掉Double
valueAtOneQuarter(x => 3 * x) // 只有一个参数时,可以省去()
valueAtOneQuarter(3 * _) // 参数只在右侧出现一次,可以用_替换
4.柯里化
一个函数有2个参数我们可以转化为2个函数,第一个函数的返回值作为第二个函数的入参
def sum_Currying(x:Int)=(y:Int)=>x+y
sum_Currying(1)(2) ,输出3
简写
def sum_Currying1(x:Int)(y:Int)=x+y
sum_Currying1(1)(2) ,输出3
(1 to 100).reduceLeft(_+_) ,输出5050,这里reduceLeft讲第一个参数返回结果加上第二个参数,不断重复
5.集合的函数编程(sprak使用分布式集合函数式编程)
val List=List("Scala","Spark","Fink")
List.map(":"+_)
List.map(println)
val cal=List.map(":"+_)
cal.flatMap
网上再加强集合的函数编程
可变集合,不可变集合
模式匹配 类型参数 隐式转换 并发编程
泛型
作业:1、统计一个文件夹下面所有文件中所有单词出现的总次数
单词空格分割
定义分割符号
定义单词Map
定义目录根路径
获取目录
目录递归遍历
判断是文件的,打开,用分割符号分割,同时去掉前后空格,然后检查Map是否存在,存在则讲值加1,不是则添加
import java.io.File
object Walk {
walk(new File("h:/tomcat6"))
def walk(file:File){
if(file.isFile())println(file.getName()) else file.listFiles().foreach(walk)
}
}
IMF特别行动组
网上相关内容参考
http://nerd-is.in/2013-09/scala-learning-higher-order-functions/
package scala.homework
/**
* Created by smile_fw on 2016/1/3.
*/
import java.io.File
import scala.io.Source
object WordStatistics {
var wordCount: Map[String, Int] = Map()
var regular="[a-zA-Z]+".r
val rootpath="F:\\资料\\测试数据"
def main(args: Array[String]) {
walk(new File(rootpath))
for ((key,value)<-wordCount)
println(key+" : "+value)
}
def walk(file:File): Unit ={
if(file.isFile()){
println(file.getPath)
readFile(file)}
else
file.listFiles().foreach(walk)
}
def readFile(file:File){
println(file.getPath)
for (line <- Source.fromFile(file,"GBK").getLines())
count(line)
}
def count(line:String): Unit ={
for (word<-regular.findAllIn(line)){
if(wordCount.contains(word))
wordCount += (word -> (wordCount(word)+1))
else
wordCount += (word -> 1)
}
}
}
原文:http://www.cnblogs.com/jackie-fan/p/5107870.html