16.高阶函数

32 阅读3分钟
高阶函数:是一种特殊的函数,特殊之处在于:它指使用其他函数作为参数或返回值。

话不多说,代码如下:

object Base61 {
  def main(args: Array[String]): Unit = {

    val arr = Array(1,2,3,4,5)

    val fn = (x:Int) => x * 2  //fn是一个字面量函数

    val arr1 = arr.map( fn ) // map是一个高阶函数,因为它的参数类型是 函数!
    
    //用for循环输出
    for(i <- arr1){
      println(i)
    }
  }
}
关于上面代码,没有必要单独定义一个函数fn,这里直接写在map函数内,此时,它就是一个匿名函数
更改后代码如下:
object Base61 {
  def main(args: Array[String]): Unit = {

    val arr = Array(1,2,3,4,5)

    val arr1 = arr.map( x=> x * 2 )

    for(i <- arr1){
      println(i)
    }
  }
}

运行结果: 2 4 6 8 10

练习:把(1,2,3,4,5) ->(1,4,9,16,25)

object Base62 {
  def main(args: Array[String]): Unit = {

    val arr = Array(1,2,3,4,5)

    val arr1 = arr.map( x=> x * x )

    for(i <- arr1){
      println(i)
    }
  }
}
那结果毋庸置疑:1 4 9 16 25

练习:把(-1,2,-3,-4) -> (1,2,3,4)

object Base62 {
  def main(args: Array[String]): Unit = {

    val arr = Array(-1,2,-3,-4)

    val arr1 = arr.map( x=> if(x>0)x else -x )

    for(i <- arr1){
      println(i)
    }
  }
}
结果依旧正确:1 2 3 4

把数组中每个元素都打印出来

foreach:依次使用当前的函数来处理数组中的每一个元素
object Base63 {
  def main(args: Array[String]): Unit = {
    val arr = Array(-1,2,-3,-4,5)
    arr.foreach(println)
  }
}
结果:
-1
2
-3
-4
5

把数组中的偶数保留下来,组成新数组

    filter:过滤
    filter(函数fn),如果fn的返回值是true,就保留这个元素
object Base64 {
  def main(args: Array[String]): Unit = {
    val arr = Array(1,2,3,4,5)
    val arr1 = arr.filter(x => x%2 == 0)
    arr1.foreach(println)
  }
}
题目:去掉不及格的分数:(60,59,80,70)->(60,80,70)
object Base65 {
  def main(args: Array[String]): Unit = {
    val arr = Array(60,59,80,70)
    val arr1 = arr.filter(x => x>=60)
    arr1.foreach(println)
  }
}
结果依旧: 60 80 70

将(1,2,3)(4,5,6)->(1,2,3,4,5,6)

flatten函数
作用:将二维数组中的元素展平至单数组中。
object Base66 {
  def main(args: Array[String]): Unit = {
    var arr1 = Array(   Array(1,2,3),   Array(4,5,6));

    arr1(0).foreach(println)
    println(arr1(0)(0))
    var arr2 = arr1.flatten
    arr2.foreach(println)
  }
}

reduce:聚合。

object Base67 {
  def main(args: Array[String]): Unit = {
    var arr = Array(1,2,3,4,5)

    var sum = arr.reduce((x,y)=> x+y)
    // var s = arr.sum
    println(sum)
  }
}
结果:15

求最大值和最小值

object Base68 {
  def main(args: Array[String]): Unit = {
    var arr = Array(-1,20,30,14)

    val max = arr.reduce((x,y) => if (x>y) x else y)

    println(max)

    val min = arr.reduce((x,y) => if (x<y) x else y)


    println(min)
  }
}
结果:30 -1

fold:带初值的reduce

object Base69 {
  def main(args: Array[String]): Unit = {
    var arr = Array(1,2,3)

//    val sum = arr.reduce((x,y) => x+y)
    val sum1 = arr.fold(100)((x,y)=>x+y)

    println(sum1)
  }
}
结果:106

屏幕截图 2025-10-22 111717.png

sorted:对元素进行排序。它会直接使用自身的自然顺序进行排序。

object Base70 {
  def main(args: Array[String]): Unit = {
    var arr = Array(-1,20,3,2,50)

    var arr1 = arr.sorted
    var arr2 = Array("banana","zip","b","a","apple")
    var arr3 = arr2.sorted
    arr1.foreach(println)
    arr3.foreach(println)
  }

屏幕截图 2025-10-22 112737.png

屏幕截图 2025-10-22 112756.png

sortedWith:

如何将Array(-1,0,1,3,2)中的所有元素,按它们到0点的距离排序?
object Base71 {
  def main(args: Array[String]): Unit = {
    var arr = Array(-1,0,1,3,2)
//    排序函数:(元素a,元素b)=>Bool。乳沟返回true,则 表示 元素a 应排在 元素b 之前
//    var arr1 = arr.sortWith((a,b)=> a0的距离 < b0的距离)
    对arr中所有元素按照他们距离 3 的距离的大小从小到大排序
    var arr1 = arr.sortWith( (a,b)=> Math.abs(a-3) < Math.abs(b-3))
    arr1.foreach(println)
  }
}