ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
**高阶函数:** 可以将其他函数作为参数,或者将其它函数作为返回值的函数称为高阶函数。 ```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) } } ```