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

相关推荐
是阿威啊5 天前
【用户行为归因分析项目】- 【企业级项目开发第五站】数据采集并加载到hive表
大数据·数据仓库·hive·hadoop·spark·scala
是阿威啊8 天前
【用户行为归因分析项目】- 【企业级项目开发第四站】模拟三类用户行为数据上传到Hadoop
大数据·hadoop·分布式·sql·scala
今天没有盐10 天前
Python字符串操作全解析:从基础定义到高级格式化
后端·scala·编程语言
是阿威啊11 天前
【用户行为归因分析项目】- 【企业级项目开发第一站】项目架构和需求设计
大数据·hive·hadoop·架构·spark·scala
代码于老总13 天前
【Scala 技巧】用隐式类给 String “开挂”:一行代码实现手机号 / 身份证号校验
scala
scala舔狗汪13 天前
scala的隐式对象和隐式类
scala
是阿威啊14 天前
【maap-analysis】spark离线数仓项目完整的开发流程
大数据·分布式·spark·scala
豚踢兔x19 天前
正则表达式应用-手机号打码
scala
代码于老总20 天前
正则表达式在 Scala 中的应用
scala
凯新生物1 个月前
聚乙二醇二生物素,Biotin-PEG-Biotin在生物检测中的应用
scala·bash·laravel·perl