13.高阶函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15014327/article/details/83692708

一.高阶函数介绍

高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即:函数参数);另外一种是返回值是函数的函数。

演示示例:

object High {
  def main(args: Array[String]): Unit = {
    //1.调用参数为函数的函数
    val str = int2Str { x => x + " s" }
    println(str)
    //2.调用返回值为函数的函数
    //val result = multiBy(10)(5)
    val x = multiBy(10)
    val result = x(5)
    println(result)
  }
  def int2Str(f:(Int)=>String) = f(10)
  def multiBy(factor:Double) = (x:Double) => x * factor
}

二.常用高阶函数

//1. map函数(map函数中参数为函数)
//scala中,字符串*n表示字符串重复n遍
//1.1 Array
val arr = Array("spark","hive","hadoop").map(x=>x*2)
//可以简写为:Array("spark","hive","hadoop").map(_*2)
println(arr.mkString(","))
//结果:sparkspark,hivehive,hadoophadoop
//1.2 List
val list = List("spark","hive","hadoop")
val list1 = list.map(_*2)
println(list1.mkString(","))
//结果:sparkspark,hivehive,hadoophadoop
val list2 = List("spark" -> 1,"hive" -> 2,"hadoop" -> 3)
val list21 = list2.map(_._1) // x=x._1
println(list21.mkString(","))
//结果:spark,hive,hadoop
val list22 = list2.map(_._2) // x=x._2
println(list22.mkString(","))
//结果:1,2,3
//1.3 Map
val map = Map("spark" -> 1,"hive" -> 2,"hadoop" -> 3)
val map1 = map.map(_._1) // x=x._1
println(map1.mkString(","))

//2.flatMap函数
val result = List(List(1,2,3),List(2,3,4)).flatMap(x => x)
println(result)
//结果:List(1, 2, 3, 2, 3, 4)
val result1 = List(List(1,2,3),List(2,3,4)).flatMap(x => x.map(_+100))
println(result1)
//结果:List(101, 102, 103, 102, 103, 104)

//3.filter函数
// 过滤条件
val arr1 = Array(1,2,3,4,5).filter(_ > 3)
println(arr1.mkString(","))
//结果:4,5
val list3 = List("tom","lily","ketty").filter(_.length() == 4)
println(list3.mkString(","))
//结果:lily

//4.reduce函数
val sum = Array(1,2,3,4).reduce(_+_)
println(sum)
//结果:10
val multi = Array(1,2,3,4).reduce(_*_)
println(multi)
//结果:24
val sum1 = Array(1,2,3,4).reduce((x:Int,y:Int) => {println(x,y);x+y})
println(sum1)
//结果:(1,2)
//    (3,3)
//    (6,4)
//    10
val sum2 = Array(1,2,3,4).reduceLeft((x:Int,y:Int) => {println(x,y);x+y})
println(sum2)
//结果:(1,2)
//    (3,3)
//    (6,4)
//    10
val sum3 = Array(1,2,3,4).reduceRight((x:Int,y:Int) => {println(x,y);x+y})
println(sum3)
//结果:(3,4)
//    (2,7)
//    (1,9)
//    10
//5.fold函数
val sum4 = Array(1,2,3,4).foldLeft(0)((x:Int,y:Int) => {println(x,y);x+y})
//可以简写为:(0 /: Array(1,2,3,4))(_+_)
println(sum4)
//结果:(0,1)
//    (1,2)
//    (3,3)
//    (6,4)
//    10
val sum5 = Array(1,2,3,4).foldRight(10)((x:Int,y:Int) => {println(x,y);x+y})
println(sum5)
//结果:(4,10)
//    (3,14)
//    (2,17)
//    (1,19)
//    20
//6.scan函数
//从左扫描,每步结果都保存起来,执行完成后生成数组
val sum6 = Array(1,2,3,4).scanLeft(0)((x:Int,y:Int)=>{println(x,y);x+y})
println(sum6.mkString(","))
//结果:(0,1)
//    (1,2)
//    (3,3)
//    (6,4)
//    0,1,3,6,10
val sum7 = Array(1,2,3,4).scanRight(10)((x:Int,y:Int)=>{println(x,y);x+y})
println(sum7.mkString(","))
//结果:(4,10)
//    (3,14)
//    (2,17)
//    (1,19)
//    20,19,17,14,10

三.柯里化

def multiplyBy1(factor:Double) = (x:Double) => x * factor
//柯里化
def multiplyBy2(factor:Double)(x:Double) = x * factor
//注意:柯里化之后,就不能像multiplyBy1那样输入一个参数进行调用了

四.部分应用函数

部分应用函数:当函数有多个参数,而在我们使用该函数时我们不想提供所有参数(假设函数有3个函数),只提供0~2个参数,此时得到的函数便是部分应用函数。

    Array("Hadoop","Hive","Spark") foreach(x => println(x))
    //等价于
    def print(x:String) = println(x)
    Array("Hadoop","Hive","Spark").foreach(print)
    //下划线_并不是占位符的作用,而是作为部分应用函数的定义符
    //1.一个参数的部分应用函数
    val p = print _
    Array("Hadoop","Hive","Spark").foreach(p)
    //2.多个参数的部分应用函数
    //定义一个求和函数
    def sum(x:Int,y:Int,z:Int) = x + y + z
    //不指定任何参数
    val s1 = sum _
    println(s1(1,2,3))
    //指定两个参数的部分应用函数
    val s2 = sum(1,_:Int,3)
    println(s2(2))
    //指定一个参数的部分应用函数
    val s3 = sum(1,_:Int,_:Int)
    println(s3(2,3))
    //3.柯里化函数和部分应用函数
    def multiBy1(factor:Int)=(x:Int)=>factor*x
    def multiBy2(factor:Int)(x:Int) = factor*x
    val x = multiBy1(5)
    val y = x(10)
    //val z = multiBy2(5) 报错,它不能像没柯里化的函数一样返回一个函数
    val z = multiBy2(5)_  //但是它可以它的部分应用函数
    val z1 = z(10)

参考自:https://blog.csdn.net/column/details/scalalearning.html

猜你喜欢

转载自blog.csdn.net/qq_15014327/article/details/83692708
今日推荐