高阶函数

1. 数组过滤:筛选符合条件的元素(filter)

filter 是数组最常用的筛选工具,它接收一个返回布尔值的函数,保留函数返回 true 的元素,最终返回新数组。

  • 筛选数组中的偶数
  • 筛选分数中大于 80 分的成绩
scala 复制代码
object base51 {
  def main(args: Array[String]): Unit = {
    // 把数值为偶数的留下来
    val arr1 = Array(1,2,3,4,5)
 //   val arr2 = arr1.filter( x=> {
 //     // println(x)
 //    x%2 == 0
 //  })
    val arr2 = arr1.filter(x => x%2==0)
    arr2.foreach(println)

    var score = Array(90,98,60,49,100)
    //把小于80分的值去掉,只保留大于80分的分数
    var score1 = score.filter(x =>  x>80).foreach(println)

 }
}

2. 数组聚合:元素累加(reduce 与 sum)

当需要对数组元素进行 "合并" 计算(如求和、求积)时,reduce 是核心工具,它通过迭代两两元素计算最终结果;而 sum 是求和的简化 API,本质是 reduce 的封装。

计算数组所有元素的累加和

scala 复制代码
object base52 {
  def main(args: Array[String]): Unit = {
   val arr  = Array(1,2,3,4,5)
    //求数组元素的累加
    val rst = arr.reduce((x, y)=> x + y)
      //val rst = arr.sum

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

3. 聚合方向:从左到右与从右到左(reduceLeft 与 reduceRight)

reduce 本质是 reduceLeft(从左往右迭代),而 reduceRight 会从右往左迭代,二者在非 "交换律" 运算(如减法、除法)中结果完全不同。

对比减法运算中,从左到右与从右到左的聚合结果

scala 复制代码
object base53 {
  //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"rst = ${rst1}")
  }
}

4. 带初始值的聚合:fold

foldreduce 的扩展,它允许传入一个 "初始值",再基于初始值迭代合并数组元素,适合需要额外基准值的聚合场景(如从 10 开始累加)。

以 10 为初始值,计算数组元素的累加和

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

5. 默认排序:sorted

sorted 是数组的默认排序工具,无需自定义逻辑,直接按照元素的 "自然顺序" 排序(数值按大小、字符串按字典序)。

  • 对数值数组从小到大排序
  • 对字符串数组按字典序排序
scala 复制代码
object base55 {
  //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)

  }
}

6. 自定义排序:sortWith

当默认排序无法满足需求(如按 "元素到 1 的距离" 排序、按字符串长度排序)时,sortWith 支持通过自定义函数实现排序逻辑。

对数值数组,按 "元素到 1 的距离" 从小到大排序

scala 复制代码
object base56 {
  //sortWith:自定义排序
 //sortWith( (x,y) => 布尔值 )
 //(1) 如果返回值是true,那么x就在y的前面
 //(1) 如果返回值是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)

  }
}

总结:数组操作 API 对比与选型

操作类型 核心 API 适用场景 关键特点
筛选 filter 保留符合条件的元素 返回新数组,不修改原数组
聚合 reduce 无初始值的合并计算 从数组第一个元素开始迭代
聚合 fold 有初始值的合并计算 需传入初始值,灵活性更高
排序 sorted 默认自然顺序排序 数值升序、字符串字典序
排序 sortWith 自定义规则排序 支持任意比较逻辑,灵活度最高
相关推荐
陈随易14 分钟前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·后端·程序员
IT_陈寒3 小时前
Vite的热更新突然不香了,排查三小时差点砸键盘
前端·人工智能·后端
子兮曰3 小时前
Agency-Agents 深度解析:400+ AI 专家的"梦之队"如何重塑开发工作流
前端·后端·vibecoding
用户8356290780514 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
小满zs4 小时前
Go语言第二章(小无相功)
后端·go
用户8356290780514 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
karry_k4 小时前
MyBatis批量insert-select踩坑:useGeneratedKeys=true 可能让PostgreSQL返回大量插入结果
java·后端
妙码生花4 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十九):点选验证码代码逐行目检
前端·后端·go
贰先生4 小时前
Xiuno BBS X版 用户封禁系统
后端
karry_k4 小时前
PostgreSQL 在 MyBatis 中执行正常 SQL 失效:一次 DELETE USING 踩坑记录
java·后端