Scala: 💕高阶函数(1)💕

92 阅读3分钟

一. 介绍高阶函数

定义

高阶函数:是一种特殊的函数,特殊之处在于:它指使用其他函数作为参数或者返回值。

Scala的常见高阶函数╰(°▽°)╯

map、flatten、flatmap、foreach、reduce、filter和fold等。

常见应用场景

  • 回调函数:如事件处理(点击、异步请求)中,将函数作为参数传递,在特定时机执行。
  • 函数式工具函数:如 mapfilterreduce(对集合进行映射、过滤、聚合)。
  • 装饰器(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)
    }
  }
}

结果

Snipaste_2025-10-21_11-22-04.png

为什么需要高阶函数?🧐

  • 抽象通用逻辑:将重复的流程(如遍历)封装,通过传入不同函数实现具体逻辑,减少代码冗余。
  • 增强灵活性:动态组合函数,适应不同场景(如根据条件返回不同处理函数)。
  • 支持函数式编程范式:使代码更简洁、可读,便于进行函数组合和复用。

二. 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} ")
    }
  }
}

结果

11-24-36.png

三. foreach函数

介绍

foreach 是一个高阶函数(higher-order function),用于遍历集合(如列表、数组、集合等可迭代对象)中的每个元素,并对每个元素执行指定的操作(通常是一个匿名函数或代码块)。它的核心作用是 “消费” 集合中的元素,不返回新的集合(返回值为 Unit,类似 Java 中的 void)。

关键特性

  • 无返回值foreach 的返回类型是 Unit,因此它仅用于执行副作用(如打印、修改外部变量等),不适合用于转换集合(转换集合应使用 mapflatMap 等)。
  • 遍历所有元素foreach 会遍历集合中的每一个元素,无法中途跳出循环(类似 Java 中的 for-each,不支持 break)。若需要条件中断,可考虑使用 for 循环配合 breakable
  • 适用于所有可迭代类型:Scala 中所有实现了 Iterable 特质的集合(如 ListArraySetMapRange 等)都支持 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} ")
//    }
  }
}

结果

36.png