scala中的高阶函数(二)

65 阅读3分钟

1.filter函数;

2.reduce函数;

3.fold函数;

4.sorted函数;

5.sortedWith函数;

(一)filter函数

作用:对数组元素使用函数进行过滤。

语法:新数组= 旧数组.filter(元素=>bool)  它的参数是一个函数,这函数的返回值是布尔值。如果返回为true就保留。

例如:

示例1:把数值为偶数的留下来

示例2:把小于80分的值去掉,只保留大于80分的分数

object Main {
  /**
   * filter
   * 过滤器
   * filter(函数)
   * 如果函数的返回值为true,则元素被保留下来
   */
  def main(args: Array[String]): Unit = {
    // 示例1:把数值为偶数的留下来
    val arr1 = Array(1, 2, 3, 4, 5)
    val arr2 = arr1.filter(x => x % 2 == 0)
    println("偶数结果:")
    arr2.foreach(println)  // 输出: 2, 4

    // 示例2:把小于80分的值去掉,只保留大于80分的分数
    var score = Array(90, 98, 60, 49, 100)
    val highScores = score.filter(x => x > 80)
    println("大于80分的分数:")
    highScores.foreach(println)  // 输出: 90, 98, 100
  }
}

filter 工作原理:

  • 遍历集合中的每个元素
  • 对每个元素应用判断函数
  • 只保留使函数返回 true 的元素
  • 返回一个新的集合,不改变原集合

(二)reduce函数

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

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

image.png

例如:

求数组元素累加

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

    // 使用 reduce 求数组元素的累加
    val rst = arr.reduce((x, y) => x + y)

    println(s"rst = $rst")  // 输出: rst = 15
  }
}

(三)reduceLeft-reduceRight

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

例如:

object Main {
    // reduce ==== reduceLeft 从左向右计算
    // reduceRight 从右向左计算
    def main(args: Array[String]): Unit = {
        val arr = Array(1, 2, 3)
        val rst = arr.reduceLeft((x, y) => x - y)
        val rst1 = Array(1, 2, 3, 4).reduceRight((x, y) => x - y)
        println(s"rst = ${rst}")
        println(s"rst1 = ${rst1}")
    }
}

注意事项:

  • reduce 默认就是 reduceLeft
  • 对于非交换运算(如减法),reduceLeft 和 reduceRight 的结果可能不同
  • 对于交换运算(如加法),两者结果相同:reduceLeft(_ + _) == reduceRight(_ + _)

(四)fold

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

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

例如:

object Main {
    // fold: 带初值的reduce
    def main(args: Array[String]): Unit = {
        val rst = Array(1, 2, 3).fold(10)((x, y) => x + y)
        println(s"rst = ${rst}") // 16
    }
}

使用场景

  • 需要初始值的累加操作
  • 空集合处理(reduce 在空集合上会抛异常,fold 会返回初始值)
  • 复杂的聚合计算

fold 方法提供了更大的灵活性,特别是在处理边界情况和需要初始值的场景中。

(五)sorted函数

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

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

例如:

object Main {
    // sorted: 排序
    def main(args: Array[String]): Unit = {
        // 对数值元素排序:从小到大排序
        var arr = Array(-1, 10, -2, 1, 2, 3).sorted
        arr.foreach(println)
        
        // 对字符元素排序,字典顺序
        var arr2 = Array("zoom", "bus", "apple", "banana", "car").sorted
        arr2.foreach(println)
    }
}

sorted 方法详解

1. 数值排序

  • 默认按升序排列(从小到大)
  • 支持负数排序
  • 数值类型直接比较大小

2. 字符串排序

  • 按字典顺序(lexicographical order)
  • 基于 Unicode 编码比较
  • 大写字母排在小写字母之前(如果需要忽略大小写,需要特殊处理)

(六)sortedWith

功能:按自定义规则排序

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

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

例如:

object Main {

    // sortWith: 自定义排序
    // sortWith( (x, y) => 布尔值 )
    // (1) 如果返回值是true,那么x排在y的前面
    // (2) 如果返回值是false,那么x排在y的后面

    def main(args: Array[String]): Unit = {
        // 对数值元素排序:按照距离数字1的绝对距离从小到大排序
        var arr = Array(-1, 10, -2, 1, 2, 3).sortWith((x, y) => Math.abs(x - 1) < Math.abs(y - 1))
        arr.foreach(println)
    }
}

sortWith 提供了最大的灵活性,可以实现任何复杂的排序逻辑。