一. 介绍高阶函数
定义
高阶函数:是一种特殊的函数,特殊之处在于:它指使用其他函数作为参数或者返回值。
Scala的常见高阶函数╰(°▽°)╯
map、flatten、flatmap、foreach、reduce、filter和fold等。
常见应用场景
- 回调函数:如事件处理(点击、异步请求)中,将函数作为参数传递,在特定时机执行。
- 函数式工具函数:如
map、filter、reduce(对集合进行映射、过滤、聚合)。 - 装饰器(Decorators) :动态增强函数功能(如日志、缓存),常见于 Python、TypeScript 等。
- 柯里化(Currying) :将多参数函数转化为一系列单参数函数,便于分步传参。
代码展示: 💕高阶函数:一种特殊的函数,它的参数或者返回值是函数类型。💕
object base1601 {
// 1. map函数:对数组中每一个元素执行一个函数,来得到一个新数组。
def main(args: Array[String]): Unit = {
val arr1 = Array(1,2,3,4,5,6)
// Array是一个构造器,用来定义一个数组。
// arr1 就是一个数组对象,它有很多的方法,其中就有map。
// for 循环来输出数组中每个元素
var fn = (x:Int) => x * 2
// fn是一个函数,它被传给了map。map是一个高阶函数
val arr2 = arr1.map(fn)
// for 循环来输出数组中的每个元素
for (i <- arr2){
println(i)
}
}
}
结果
为什么需要高阶函数?🧐
- 抽象通用逻辑:将重复的流程(如遍历)封装,通过传入不同函数实现具体逻辑,减少代码冗余。
- 增强灵活性:动态组合函数,适应不同场景(如根据条件返回不同处理函数)。
- 支持函数式编程范式:使代码更简洁、可读,便于进行函数组合和复用。
二. map函数
介绍
map 是高阶函数中最常用的工具之一,它的核心作用是对集合(如数组、列表等)中的每个元素应用同一个函数,并返回一个包含所有处理结果的新集合。它不会修改原集合,而是生成新集合,这符合函数式编程 “无副作用” 的特点。
基本特性
- 参数:通常接受两个参数 —— 一个处理函数(用于转换元素)和一个集合(被处理的数据源)。
- 返回值:一个新的集合,其中每个元素是原集合元素经过处理函数后的结果。
练习
把数组(1,2,3,4,5) → (2,4,6,8,10)
作用
通过对数组的每一个元素应用一个函数来构建一个新数组。
语法
新数组 = 旧数组.map(旧元素=>新元素)
代码
object base1602 {
/*
* map 的练习题
* */
def main(args: Array[String]): Unit = {
val arr1 = Array(1,2,3,4,5)
val arr2 = arr1.map(x => x * x)
for (i <- arr2) {
print(s"${i} ")
}
val arr3 = Array(-1,2,-3,-4)
// 绝对值
val arr4 = arr3.map(x => if(x>0) x else -x)
println()
for (i <- arr4) {
print(s"${i} ")
}
}
}
结果
三. foreach函数
介绍
foreach 是一个高阶函数(higher-order function),用于遍历集合(如列表、数组、集合等可迭代对象)中的每个元素,并对每个元素执行指定的操作(通常是一个匿名函数或代码块)。它的核心作用是 “消费” 集合中的元素,不返回新的集合(返回值为 Unit,类似 Java 中的 void)。
关键特性
- 无返回值:
foreach的返回类型是Unit,因此它仅用于执行副作用(如打印、修改外部变量等),不适合用于转换集合(转换集合应使用map、flatMap等)。 - 遍历所有元素:
foreach会遍历集合中的每一个元素,无法中途跳出循环(类似 Java 中的for-each,不支持break)。若需要条件中断,可考虑使用for循环配合breakable。 - 适用于所有可迭代类型:Scala 中所有实现了
Iterable特质的集合(如List、Array、Set、Map、Range等)都支持foreach方法。
练习
打印数组中的元素
作用
对数组的每一个元素应用函数。
语法
数组.foreach(元素=>{})
代码
object base1603 {
/*
* foreach
*
* */
def main(args: Array[String]): Unit = {
val arr1 = Array(1,2,3,4,5)
// arr1.foreach( x => print(x))
arr1.foreach(print)
arr1.foreach(println)
// for (i <- arr1){
// print(s"${i} ")
// }
}
}