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 特质(如 Int、String 等默认实现)。
示例:
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 等辅助函数)。