scala的高阶函数2

34 阅读2分钟

前面我们学习了一部分高阶函数,内部包括 map, foreach,filter,flatten

reduce函数

作用:reduce 是一种集合操作,用于对集合中的元素进行聚合操作,返回一个单一的结果。 它通过指定的二元操作(即取两个元素进行操作)对集合中的所有元素进行递归处理,并最终将其合并为一个值

语法:reduce 函数需要一个函数作为参数,这个函数接受两个相同类型的参数,并返回一个值。

def main(args: Array[String]): Unit = {
  //定义一个数组
  val arr = Array(1,2,3,4,5)

  val rst = arr.reduce( (x,y) => x + y )
  println(s"rst = ${rst}")  //15
}

案例:  求 -1,2,30,5 四个数的最大值和最小值

def main(args: Array[String]): Unit = {
  //定义一个数组
  val arr = Array(-1,2,30,5)
  
  // 求最大值
  val rst_max = arr.reduce( (x,y) => if(x > y) x else y)

  // 求最小值
  val rst_min = arr.reduce( (x,y) => if(x < y) x else y)

  println(s"rst_max = ${rst_max}")  //30
  
  println(s"rst_min = ${rst_min}")  //-1
}

reduceLeft-reduceRight

reduceLeft是从集合的左侧开始聚合,与reduce等价; reduceRight是从集合的右边开始。

def main(args: Array[String]): Unit = {
  //定义一个数组
  val arr = Array(1,2,3)

  // reduce ==== reduceLeft

  val rst1 = arr.reduceLeft( (x,y) => x + y ) // 6  (1+2+3)
  val rst2 = arr.reduceLeft( (x,y) => x - y ) // -4  (1-2-3)

  val rst3 = arr.reduceRight( (x,y) => x - y )  // 2 (2-3=-1  1-(-1)=2)

  println(s"rst1 = ${rst1}")
  println(s"rst2 = ${rst2}")
  println(s"rst3 = ${rst3}")

fold

与reduce类似 都是做聚合操作 但是 它有一个初始值

作用:fold 是一种集合操作(与reduce类似),用于对集合中的元素进行聚合操作,返回一个单一的结果,需要提供一个初始的“种子”值。

语法:数组.fold(初值)(函数)

def main(args: Array[String]): Unit = {
  //定义一个数组
  val arr = Array(1,2,3,4)

  // 10 就是初始值
  val rst = arr.fold(10)( (x,y) => x+y )

  println(s"rst=${rst}")  //20
}

sorted函数

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

语法:新数组 = 原数组.sorted

案例:对数值排序,对字符排序

def main(args: Array[String]): Unit = {
    //定义一个数组
//    val arr = Array(-1,20,3,40)

//    var arr1 = arr.sorted

//    arr1.foreach(println)

    // 对数值进行排序 从小到大
    Array(-1,20,9,13,70).sorted.foreach(println)  // -1 9 13 20 70

    // 对字符排序 按照字典排序
    // 字典序排序规则:先看大小写字母:大写字母 < 小写字母
    //               同大小写按字母表顺序
    Array("PURPLE","GREEN","bus","Pink").sorted.foreach(println)  // GREEN PURPLE Pink bus
  }

sortWith 函数

功能:按自定义规则排序

语法:新数组 = 原数组.sortedWith(排序函数)

排序函数: (元素a,元素b)=>Bool。如果返回 true,则 表示元素a应排在元素b之前。

def main(args: Array[String]): Unit = {
  //定义一个数组

  // 对数值进行排序 按高0点的距离大小进行排序
  // sortWith( (x,y) => 布尔值)
  // true: x 应该要排在y的前面
  // false: x 要排在 y 的后面
  
  // 从小到大排序
  Array(-1,2,0,9,4).sortWith((x,y) => Math.abs(x-0) < Math.abs(y-0) ).foreach(println)  // 0 -1 2 4 9
  
  // 从大到小排序
  Array(-1,2,0,9,4).sortWith((x,y) => x > y).foreach(println)  // 9 4 2 0 -1  
}