**高阶函数:** 可以将其他函数作为参数,或者将其它函数作为返回值的函数称为高阶函数。
```scala
// 函数作为参数
def doSquare(f:Int => Int, p:Int) = f(p)
def square(x:Int):Int = x*x
// 调用
doSquare(square, square(2))
// 函数作为返回值
// 返回类型为 (Int => Int) 函数
def doSquare()= {
(x:Int) => x * x
}
doSquare()(2)
```
<br/>
**常用的内置高阶函数:**
```scala
map
foreach
filter
fold、foldLeft、foldRight
reduce
zip
flatten
flatMap
```
```scala
object HighLevelFun {
def main(args: Array[String]): Unit = {
val list = List(1, 2, 3, 4, 5)
// map操作, 对一个集合/迭代器里边的每一个值进行遍历, 生成一个新的集合/迭代器作为返回值返回
val maped:List[Int] = list.map(x => x * 2) // List(2, 4, 6, 8, 10)
// foreach操作, 对一个集合/迭代器里边的每一个值进行遍历, 用于输出
maped.foreach(println) // 2 4 6 8 10
maped.foreach(x => println(x)) // 2 4 6 8 10
// map与foreach合并
// 个别情况下, 可以使用_代替参数, 有限制: 适用于参数只用到一次的情况
// 个别情况下, 可以省略括号里的东西
list.map(_*2).foreach(println) // 2 4 6 8 10
// filter操作, 对一个集合/迭代器里边的每一个值进行遍历, 根据条件表达式进行判断,
// 条件满足的留下, 不满足的过滤掉生, 成一个新的集合/迭代器作为返回值返回
val list2 = List(1, 2, 3, 4, 5)
val filtered:List[Int] = list2.filter(_%2==1)
filtered.foreach(x => print(s"$x ")) // 1 3 5
// fold操作, 对一个集合/迭代器里边的每一个值进行遍历,
// 每次取两个值进行运算, 得到的结果参加下一次运算, 最终返回一个结果值
val sum1:Int = list2.fold(0)((x, y)=>x-y) // fold的源码就是foldLeft
val sum2:Int = list2.foldLeft(0)((x,y)=>x-y)
/*
foldLeft或fold的计算步骤如下:
0-1=-1
-1-2=-3
-3-3=-6
-6-4=-10
-10-5=-15
*/
val sum3:Int = list2.foldRight(0)((x,y)=>x-y)
/*
foldRight的计算步骤如下:
// 5-0=5
// 4-5=-1
// 3-(-1)=4
// 2-4=-2
// 1-(-2)=3
*/
println(sum1, sum2, sum3) // (-15,-15,3)
// reduce操作, 对一个集合/迭代器里边的每一个值进行遍历,
// 每次取两个值进行运算, 得到的结果参加下一次运算, 最终返回一个结果值
val list3 = List(1, 2, 3, 4, 5)
val reduced:Int = list3.reduce(_+_)
// reduced2与reduced写法的一样的结果
val reduced2:Int = list3.reduce((x, y)=> x+y)
println(reduced) // 15
println(reduced2) // 15
// zip操作, 拉链函数, 将两个函数一一对应的合在一起, 返回一个元组的集合
val strList = List("a", "b", "c", "d", "e")
val intList = List(1, 2, 3, 4)
val tuples:List[(String, Int)] = strList.zip(intList)
tuples.foreach(println) // (a,1) (b,2) (c,3) (c,3)
// flatten操作, 扁平化, 将嵌套的集合压平, 直接将里边的元素放在最外层的集合里
val strings = List("hello world","spark python scala")
strings.map(x=>x.split(" ")).flatten.foreach(println) // hello world spark python scala
// flatMap操作, 先进行map操作, 在进行flatten操作, 参数为map函数需要的参数
strings.flatMap(_.split(" ")).foreach(println) // // hello world spark python scala
// Wordcount 演示
val wordCounts = List("hello hello world world","spark java spark hello python scala")
wordCounts.flatMap(_.split("\\s+")).map((_, 1)).groupBy(_._1).map(x=>(x._1,x._2.size)).foreach(println)
// (world,2) (java,1) (spark,2) (scala,1) (python,1) (hello,3)
}
}
```
- Scala是什么?
- Scala特性
- 开发环境搭建
- 环境搭建
- windows下的环境搭建
- IntelliJ IDEA环境搭建
- Scala关键字
- Hello, World
- 数据类型
- 数据类型
- 数据类型层次结构
- 字面量
- Null类型
- Nothing类型
- Unit类型
- 变量与常量
- type定义类型别名
- 字符串插值器
- 条件控制
- 循环控制
- 数组
- 元组
- 集合
- 集合分类
- List常用操作
- Set常用操作
- Map常用操作
- 函数
- 函数声明与调用
- 函数与方法的区别
- 函数注意事项
- 匿名函数
- 可变参数
- 高阶函数
- 中置表达式
- 函数嵌套
- 函数科里化
- 隐式参数
- 隐式函数
- 闭包
- 类和对象
- Java与Scala的比较
- 有关类与对象概念
- 类
- 类的定义和调用
- 类的继承
- 抽象类
- 单例对象
- 伴生对象和伴生类
- 特质
- 定义特质
- 混入特质
- 抽象类与特质的选择
- 自身类型
- 依赖注入
- this别名
- 样例类
- 枚举类
- 泛型类
- 包与包对象
- 模式匹配
- 基本语法
- 匹配模式
- 偏函数
- 注解
- 运算符
- 正则表达式
- 隐式类
- 异常处理
- 高级类型
- 结构类型
- 复合类型