高阶函数(1)

64 阅读3分钟

1. 高阶函数的定义

在 Scala 中,高阶函数是指接收函数作为参数返回函数作为结果的函数。Scala 对函数式编程支持原生,函数可以像变量一样传递,因此高阶函数应用广泛。

示例

// 接收函数作为参数
def applyFunc(f: Int => Int, x: Int): Int = f(x)

// 定义一个函数作为参数
val double = (x: Int) => x * 2

// 调用高阶函数
println(applyFunc(double, 5))  // 输出:10

2. map函数的使用方法

map 是 Scala 集合(如 ListArray 等)的高阶函数,用于对集合中的每个元素应用指定函数,返回一个包含所有结果的新集合(原集合不变)。

语法

集合.map(函数)  // 函数接收集合元素类型,返回新类型

示例

val nums = List(1, 2, 3, 4)

// 对每个元素乘以 2(使用匿名函数)
val doubled = nums.map(x => x * 2)
println(doubled)  // 输出:List(2, 4, 6, 8)

// 简化写法(参数唯一时可用 _ 代替)
val squared = nums.map(_ * _)  // 等价于 x => x * x
println(squared)  // 输出:List(1, 4, 9, 16)

// 转换元素类型(Int -> String)
val strs = nums.map(_.toString + "元")
println(strs)  // 输出:List(1元, 2元, 3元, 4元)

3. foreach函数的使用方法

foreach 用于遍历集合中的每个元素并执行指定操作(无返回值,仅用于副作用,如打印、修改外部变量等)。 语法

集合.foreach(函数)  // 函数接收元素,无返回值(Unit 类型)

示例

val fruits = List("apple", "banana", "orange")

// 打印每个元素
fruits.foreach(println)  // 依次输出:apple、banana、orange

// 累计元素长度(副作用操作)
var totalLength = 0
fruits.foreach(s => totalLength += s.length)
println(totalLength)  // 输出:16(5 + 6 + 5)

4. filter函数的使用方法

filter 用于根据函数的布尔返回值筛选集合元素,保留使函数返回 true 的元素,返回新集合。

语法

集合.filter(函数)  // 函数接收元素,返回 Boolean

示例

val nums = List(1, 2, 3, 4, 5, 6)

// 筛选偶数
val evens = nums.filter(x => x % 2 == 0)
println(evens)  // 输出:List(2, 4, 6)

// 筛选长度大于 5 的字符串
val words = List("cat", "elephant", "dog", "giraffe")
val longWords = words.filter(_.length > 5)
println(longWords)  // 输出:List(elephant, giraffe)

5. flatten函数的使用方法

flatten 用于将嵌套的集合展开为一维集合(仅适用于元素本身也是集合的情况,如 List[List[T]] 展开为 List[T])。

语法

嵌套集合.flatten  // 要求集合元素必须是可迭代的(如 List、Array 等)

示例

// 二维列表展开为一维
val nestedList = List(List(1, 2), List(3, 4), List(5))
val flatList = nestedList.flatten
println(flatList)  // 输出:List(1, 2, 3, 4, 5)

// 嵌套数组展开
val nestedArr = Array(Array("a", "b"), Array("c"))
val flatArr = nestedArr.flatten
println(flatArr.mkString(", "))  // 输出:a, b, c

// 注意:元素非集合时无法 flatten(编译报错)
// val invalid = List(1, List(2, 3)).flatten  // 错误:Int 不是集合类型

补充:链式调用

Scala 集合的高阶函数支持链式调用,可读性强:

val result = List(1, 2, 3, 4, 5)
  .filter(_ % 2 == 1)  // 筛选奇数:List(1, 3, 5)
  .map(_ * 10)         // 乘以 10:List(10, 30, 50)
  .foreach(println)    // 打印每个元素

以上函数均为 Scala 集合的核心操作,体现了函数式编程 “无副作用”“链式转换” 的特点。