高阶函数2025.10.22

48 阅读2分钟

先看一段示例代码

scala

def main(args: Array[String]): Unit = {
    // 定义一个整数数组
    val arr = Array(1, 2, 3, 4, 5)
    
    // 定义一个函数字面量(匿名函数的具名形式)
    val fn = (x: Int) => x * 2  
    
    // 使用高阶函数map处理数组
    val arr1 = arr.map(fn)     
    
    // 输出处理后的结果
    for (i <- arr1) {
        println(i)  // 输出:2 4 6 8 10
    }
}

这段代码看似简单,却包含了 Scala 函数式编程的两个核心概念:函数字面量高阶函数

1.什么是函数字面量?

在示例中,val fn = (x: Int) => x * 2 定义了一个函数字面量。

  • 函数字面量(Function Literal)本质是匿名函数(没有名字的函数),但可以被赋值给变量(如这里的 fn),从而像值一样被传递和使用。
  • 语法结构:(参数列表) => 函数体,其中 => 是函数定义的标志,左边是输入参数,右边是具体逻辑。
  • 作用:让函数成为 “一等公民”,可以像普通变量一样作为参数传递、作为返回值返回,这是函数式编程的基础。

2.什么是高阶函数?

示例中 arr.map(fn) 里的 map 就是一个典型的高阶函数。

  • 高阶函数(Higher-Order Function)指的是接受函数作为参数返回函数作为结果的函数。

3.为什么要这样用?

相比传统的命令式编程(如用 for 循环逐个处理元素),这种方式有几个明显优势:

  1. 代码更简洁:省去了手动遍历的逻辑,直接聚焦于 “对元素做什么操作”(这里的乘以 2);
  2. 逻辑更清晰map 函数的语义明确(“映射转换”),可读性更高;
  3. 扩展性更强:如果需要改变元素的处理逻辑(比如改成加 1),只需修改传入 map 的函数即可,无需改动遍历逻辑。

object class24 {
  def main(args: Array[String]): Unit = {
    // x*2
    // {
    // }

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

    val fn = (x: Int) => x * 2  // fn 是一个字面量函数
    val arr1 = arr.map(fn)      // map是一个高阶函数,因为它的参数类型是 函数!

    // 没有必要单独定义一个函数fn,这里直接写在map函数内,此时,它就是一个匿名函数
    val arr1 = arr.map

    // 用for循环输出
    for (i <- arr1) {
      println(i)
    }
  }
}