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

相关推荐
lucky_syq1 天前
Scala与Spark算子:大数据处理的黄金搭档
开发语言·spark·scala
深兰科技3 天前
廊坊市市长刘媛率队到访深兰科技,推动机器人制造基地与产业投资落地
人工智能·科技·机器人·scala·symfony·深兰科技·廊坊市市长刘媛
萧霍7 天前
判断两个对象是相等的
scala
程序员小羊!9 天前
Flink(用Scala版本写Word Count 出现假报错情况解决方案)假报错,一直显示红色报错
flink·word·scala
173112 天前
scala中访问控制与方法重写
scala
张较瘦_14 天前
[论文阅读] 从 5MB 到 1.6GB 数据:Java/Scala/Python 在 Spark 中的性能表现全解析
java·python·scala
还是大剑师兰特19 天前
Scala面试题及详细答案100道(81-90)-- 框架与生态
scala·大剑师·scala面试题
盛小夏21 天前
用 Python 把汉诺塔玩成“魔法”:从递归到可视化,一篇就够!
scala
智海观潮24 天前
学好Spark必须要掌握的Scala技术点
大数据·spark·scala