先看一段示例代码
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 循环逐个处理元素),这种方式有几个明显优势:
- 代码更简洁:省去了手动遍历的逻辑,直接聚焦于 “对元素做什么操作”(这里的乘以 2);
- 逻辑更清晰:
map函数的语义明确(“映射转换”),可读性更高; - 扩展性更强:如果需要改变元素的处理逻辑(比如改成加 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)
}
}
}