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

相关推荐
凯新生物4 天前
聚乙二醇二生物素,Biotin-PEG-Biotin在生物检测中的应用
scala·bash·laravel·perl
谁黑皮谁肘击谁在连累直升机4 天前
文件读写-成绩分析
scala
小冻梨6 天前
模式匹配-基础使用
scala
顧棟9 天前
JAVA、SCALA 与尾递归
java·开发语言·scala
深兰科技9 天前
坦桑尼亚与新加坡代表团到访深兰科技,促进AI在多领域的应用落地
java·人工智能·typescript·scala·perl·ai大模型·深兰科技
a程序小傲10 天前
scala中的Array
开发语言·后端·scala
kk哥889910 天前
scala 介绍
开发语言·后端·scala
173111 天前
scala中的Array
scala
满山狗尾草11 天前
map的常规操作
scala
渣渣盟13 天前
Flink实时数据写入Redis实战
大数据·scala·apache