(一)什么是高阶函数
高阶函数:是一种特殊的函数,特殊之处在于:它指使用其他函数作为参数或者返回值。
Scala的常见高阶函数包括map、flatten、flatmap、foreach、reduce、filter和fold等。
scala
object Main {
/**
* 高阶函数:一种特殊的函数,它的参数或者返回值是函数类型。
* 1. map函数
*/
def main(args: Array[String]): Unit = {
val arr1 = Array(1, 2, 3, 4, 5, 6)
// Array是一个构造器,用来定义一个数组。
// arr1 就是一个数组对象,它有很多的方法,其中就有map。
val fn = (x: Int) => x * 2
// fn是一个函数,它被传给了map。map是一个高阶函数
val arr2 = arr1.map(fn)
// for 循环来输出数组中每个元素
println("使用for循环输出arr2:")
for (i <- arr2) {
println(i)
}
}
}
(二)map函数
作用:通过对数组的每一个元素应用一个函数来构建一个新数组。 语法: 新数组 = 旧数组.map(旧元素=>新元素)
map函数的工作原理
理解map的高阶函数特性
scala
object MapExplanation {
// 模拟实现map函数来理解其原理
def myMap[T, U](array: Array[T], transform: T => U): Array[U] = {
val result = new Array[U](array.length)
for (i <- array.indices) {
result(i) = transform(array(i))
}
result
}
def main(args: Array[String]): Unit = {
val numbers = Array(1, 2, 3, 4, 5)
// 使用自定义的map函数
val doubled = myMap(numbers, (x: Int) => x * 2)
val strings = myMap(numbers, (x: Int) => s"Number: $x")
println("原始: " + numbers.mkString(", "))
println("加倍: " + doubled.mkString(", "))
println("字符串: " + strings.mkString(", "))
}
}
把(1,2,3,4,5) → (1,4,9,16,25)
把(-1,2,-3,-4) → (1,2,3,4)
scala
object base48 {
def main(args: Array[String]): Unit = {
// 练习1:把 (1,2,3,4,5) → (1,4,9,16,25)
val arr1 = Array(1, 2, 3, 4, 5)
val arr2 = arr1.map(x => x * x) // 每个元素平方
println("练习1结果:")
for (i <- arr2) {
println(i)
}
// 练习2:把 (-1,2,-3,-4) → (1,2,3,4)
val arr3 = Array(-1, 2, -3, -4)
val arr4 = arr3.map(x => Math.abs(x)) // 取绝对值
println("\n练习2结果:")
for (i <- arr4) {
println(i)
}
}
}
map函数的签名:
scala
def map[B](f: (A) => B): Array[B]
- 接受一个函数
f
,该函数将类型A
转换为类型B
- 返回一个包含转换后元素的新数组
Array[B]
关键概念总结
- 高阶函数:map是典型的高阶函数,它接受一个函数作为参数
- 函数作为一等公民:函数可以像其他值一样被传递
- 不可变性:map返回新的集合,不修改原集合
- 声明式编程:关注"做什么"而不是"怎么做"
(三)foreach函数
作用:对数组的每一个元素应用函数。
语法:数组.foreach(元素=>{})
scala
object Main {
/**
* foreach
* 对数组的每一个元素都执行一次函数
*/
def main(args: Array[String]): Unit = {
val arr1 = Array(1, 2, 3, 4, 5)
// 方式1:使用完整函数字面量
arr1.foreach(x => print(x))
println() // 换行
// 方式2:使用方法引用(更简洁)
arr1.foreach(print)
println() // 换行
// 方式3:每个元素单独一行
arr1.foreach(println)
// 方式4:自定义格式输出
arr1.foreach(x => print(s"$x "))
println()
// 对比:传统的for循环
println("\n使用for循环:")
for (i <- arr1) {
print(s"$i ")
}
}
}
关键概念总结
- foreach用途:用于遍历集合并执行副作用操作
- 返回值:foreach返回Unit(不返回结果),map返回新集合
- 语法糖 :
arr.foreach(print)
是arr.foreach(x => print(x))
的简写 - 函数式编程:鼓励使用foreach代替传统的for循环
foreach是函数式编程中处理遍历和副作用的常用工具!