Scala高阶函数

59 阅读3分钟

例子:1.筛选数组中的偶数,2.筛选大于80的分数

1. 主方法定义

def main(args: Array[String]): Unit = { ... }

这是 Scala 程序的入口方法,args用于接收命令行参数,Unit表示该方法无返回值(类似 Java 的void)。

2. 筛选数组中的偶数

  • 首先定义了一个整数数组 arr1 = Array(1, 2, 3, 4, 5)

  • 核心逻辑是使用filter方法筛选偶数:

    val arr2 = arr1.filter(x => x%2 == 0)
    
    • filter是 Scala 集合的高阶函数,接收一个 “判断条件”,返回一个新集合,仅包含满足条件的元素
    • 这里的条件x => x%2 == 0表示:筛选出 “除以 2 余数为 0” 的元素(即偶数)
    • 因此arr2的结果是 Array(2, 4)
  • 最后通过arr2.foreach(println)遍历并打印筛选结果

3. 筛选高分(大于 80 分)

  • 定义分数数组 score = Array(90,98,60,49,100)

  • 同样使用filter方法筛选大于 80 分的成绩,并且链式调用foreach直接打印:

    score.filter(x => x>80).foreach(println)
    
    • 条件x => x>80表示筛选出分数大于 80 的元素

    • 符合条件的元素是90,98,100,之后输出结果

补充

代码中注释掉的部分是filter方法的完整代码块写法:

// val arr2 = arr1.filter( x=> {
//   // println(x)  // 可添加额外逻辑(如打印中间值)
//   x%2 == 0  // 筛选条件
// })

这与简化写法x => x%2 == 0功能一致,当筛选逻辑复杂时可以用代码块,简单逻辑则推荐简化写法。

下面是整体代码:
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)
  //把小于80分的值去掉,只保留大于80的分数
  val score = Array(90,98,60,49,100)
  score.filter(x => x>80).foreach(println)
}

数组累加

1. 主方法定义

def main(args: Array[String]): Unit = { ... }

这是 Scala 程序的入口方法,args用于接收命令行参数,Unit表示该方法没有返回值

2. 数组定义

val arr = Array(1, 2, 3, 4, 5)

val定义了一个不可变的整数数组arr,包含元素1, 2, 3, 4, 5

3. 计算累加和

// 用reduce方法计算累加和
val rst = arr.reduce((x, y) => x + y)

// 注释掉的是更简洁的写法:数组自带的sum方法
// val rst = arr.sum
  • reduce方法的作用reduce是 Scala 集合的高阶函数,用于对集合元素进行 “归约” 操作。它接收一个二元函数,并从左到右依次对元素应用这个函数,最终将集合 “压缩” 为一个单一的值
  • 这里的计算过程:函数(x, y) => x + y表示 “将两个参数相加”,reduce会按以下步骤执行:
    1. 先取前两个元素:1 + 2 = 3
    2. 用结果与下一个元素相加:3 + 3 = 6
    3. 继续:6 + 4 = 10
    4. 最后:10 + 5 = 15因此,rst的结果是15
  • 注释中的简化写法arr.sum是数组自带的求和方法,功能与reduce((x,y) => x + y)完全一致

4. 结果

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

使用 Scala 的字符串插值(s"...")打印结果

总结

代码通过reduce方法演示了如何对数组元素进行累加操作,本质是把两两相加的逻辑应用到整个数组,最终得到总和

下面是整体代码
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}")
}