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 函数需要一个函数作为参数,这个函数接受两个相同类型的参数,并返回一个值。
例如:
求数组元素累加
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 提供了最大的灵活性,可以实现任何复杂的排序逻辑。