高阶函数(2)

46 阅读3分钟

1. reduce函数

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

val numbers = List(1, 2, 3, 4, 5)  

val sum = numbers.reduce((a, b) => a + b)  

println(sum)  // 输出: 15

功能:对集合元素进行累积计算,将集合 “缩减” 为单个值。

原理:以集合第一个元素为初始累积值,依次将后续元素与当前累积值通过传入的函数运算,最终返回结果。

注意:集合不能为空,否则会抛出UnsupportedOperationException

示例:计算集合元素的和

val numbers = List(1, 2, 3, 4)
val sum = numbers.reduce((acc, num) => acc + num) 
// 简化写法:numbers.reduce(_ + _)
println(sum) // 输出:10

(二)reduceLeft-reduceRight

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

println( Array(1,2,3).reduceRight((x,y)=>x-y) ) // (1 - (2 - 3)) = (1 - (-1)) = 2

 println( Array(1,2,3).reduceLeft((x,y)=>x-y) ) // ((1-2)-3)

2. fold函数

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

[码] 计算带初值的累积

List[Int] = List(1, 2, 3, 4, 5)

list.fold(10)((a,b)=>a * b) // 1200

功能:与 reduce 类似,但需要指定一个

初始值,从初始值开始累积计算。

优势:支持空集合(因有初始值),且初始值类型可以与集合元素类型不同。

示例:以初始值 10 计算元素和

val numbers = List(1, 2, 3, 4)
val sum = numbers.fold(10)((acc, num) => acc + num) 
// 简化写法:numbers.fold(10)(_ + _)
println(sum) // 输出:20(10+1+2+3+4)

扩展foldLeft 和 foldRight

  • foldLeft:从左到右累积(与 fold 行为一致,fold 实际是 foldLeft 的别名)。
  • foldRight:从右到左累积,语法为 numbers.foldRight(初始值)(函数)

示例(foldRight 计算差):

val numbers = List(1, 2, 3)
val result = numbers.foldRight(0)((num, acc) => num - acc) 
// 计算过程:1 - (2 - (3 - 0)) = 1 - (2 - 3) = 1 - (-1) = 2
println(result) // 输出:2

3. sorted函数

[讲] 语法:新数组 = 原数组.sorted

[码] 对数值排序,对字符串排序

// 对数值排序  
Array(1.2,0,1.3,-1).sorted.foreach(println)  
// 对字符串进行排序  
Array("apple", "a", "about","busy","student").sorted.foreach(println)

功能:对集合进行

自然排序(升序),返回新的排序后的集合(原集合不变)。

适用场景:元素类型必须实现 Ordered 特质(如 IntString 等默认实现)。

示例

val numbers = List(3, 1, 4, 2)
val sortedNumbers = numbers.sorted // 自然升序
println(sortedNumbers) // 输出:List(1, 2, 3, 4)

val strings = List("banana", "apple", "cherry")
val sortedStrings = strings.sorted // 按字母顺序
println(sortedStrings) // 输出:List(apple, banana, cherry)

4. sortedWith函数

[问] 如何将Array(-1,0,1,3,2)中的所有元素,按它们到0点的距离排序?

[讲] 功能:按自定义规则排序

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

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

[码]

Array(-1,0,1,3,2).sortWith((x,y)=> Math.abs(x-0) < Math.abs(y-0)).foreach(println)

功能:通过自定义比较器(函数)对集合排序,返回新的排序后的集合。 适用场景:需要自定义排序规则(如降序、按对象属性排序等)。

示例

  • 整数降序排序:
val numbers = List(3, 1, 4, 2)
val sortedDesc = numbers.sortedWith((a, b) => a > b) 
// 等价于:numbers.sorted(Ordering[Int].reverse)
println(sortedDesc) // 输出:List(4, 3, 2, 1)
  • 按对象属性排序(假设有 Person 类,按年龄升序):
case class Person(name: String, age: Int)
val people = List(Person("Bob", 25), Person("Alice", 20), Person("Charlie", 30))

val sortedByAge = people.sortedWith((p1, p2) => p1.age < p2.age)
// 等价于:people.sortBy(_.age)
println(sortedByAge) 
// 输出:List(Person(Alice,20), Person(Bob,25), Person(Charlie,30))

总结

  • reduce/fold:用于聚合元素,fold 支持初始值和类型灵活转换,foldLeft/foldRight 控制累积方向。
  • sorted/sortedWith:用于排序,sorted 依赖自然排序,sortedWith 支持自定义比较逻辑。

Scala 的集合操作更强调函数式风格,支持更多简化写法(如下划线占位符、sortBy 等辅助函数)。