Scala中的高阶函数(一)

(一)什么是高阶函数

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

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]

关键概念总结

  1. 高阶函数:map是典型的高阶函数,它接受一个函数作为参数
  2. 函数作为一等公民:函数可以像其他值一样被传递
  3. 不可变性:map返回新的集合,不修改原集合
  4. 声明式编程:关注"做什么"而不是"怎么做"

(三)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 ")
        }
    }
}

关键概念总结

  1. foreach用途:用于遍历集合并执行副作用操作
  2. 返回值:foreach返回Unit(不返回结果),map返回新集合
  3. 语法糖arr.foreach(print)arr.foreach(x => print(x)) 的简写
  4. 函数式编程:鼓励使用foreach代替传统的for循环

foreach是函数式编程中处理遍历和副作用的常用工具!

相关推荐
盛小夏21 小时前
用 Python 把汉诺塔玩成“魔法”:从递归到可视化,一篇就够!
scala
智海观潮4 天前
学好Spark必须要掌握的Scala技术点
大数据·spark·scala
盛小夏5 天前
用链式风格写代码,就像在搭积木
scala
盛小夏7 天前
元组(Tuple)详解:初学者必须掌握的数据结构
scala
赞鱼儿8 天前
Scala中函数的基本使用
scala
还是大剑师兰特9 天前
Scala面试题及详细答案100道(71-80)-- 与Java的交互
scala·大剑师·scala面试题
927410 天前
12函数参数
scala
geilip14 天前
知识体系_scala_利用scala和spark构建数据应用
开发语言·spark·scala
Hello.Reader14 天前
Flink 高级配置发行版剖析、Scala 版本、Table 依赖与 Hadoop 集成实战
hadoop·flink·scala