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是函数式编程中处理遍历和副作用的常用工具!

相关推荐
小坏讲微服务2 天前
Spring Cloud Alibaba 整合 Scala 教程完整使用
java·开发语言·分布式·spring cloud·sentinel·scala·后端开发
Kiri霧2 天前
Scala 循环控制:掌握 while 和 for 循环
大数据·开发语言·scala
pale_moonlight3 天前
十、 Scala 应用实践 (上)
大数据·开发语言·scala
小坏讲微服务3 天前
SpringCloud整合Scala实现MybatisPlus实现业务增删改查
java·spring·spring cloud·scala·mybatis plus
今天没有盐4 天前
Scala Map集合完全指南:从入门到实战应用
后端·scala·编程语言
BD_Marathon5 天前
sbt 编译打包 scala
开发语言·后端·scala
92745 天前
26 trait-多继承详解
scala
渣渣盟6 天前
Flink分布式文件Sink实战解析
分布式·flink·scala·1024程序员节
-大头.6 天前
Scala全链路实战:零基础到生产级
开发语言·scala
今天没有盐7 天前
Scala 访问权限详解:private、protected 与 private
scala