**高階函數:** 可以將其他函數作為參數,或者將其它函數作為返回值的函數稱為高階函數。
```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別名
- 樣例類
- 枚舉類
- 泛型類
- 包與包對象
- 模式匹配
- 基本語法
- 匹配模式
- 偏函數
- 注解
- 運算符
- 正則表達式
- 隱式類
- 異常處理
- 高級類型
- 結構類型
- 復合類型