Scala中高阶函数的简单介绍

149 阅读3分钟

概述

在这篇博客中,我们将了解Scala中高阶函数的概念。此外,我们还将了解Scala中一些最常用的高阶函数。

高阶函数

如果一个函数可以接受另一个函数作为参数或返回一个函数作为其结果,那么这个函数就被称为高阶函数。之所以能这样,是因为在Scala中,函数是第一等公民。

如何定义一个高阶函数

1.以另一个函数作为参数的函数
object FunctionThatTakesFunction extends App {

  def math(a:Int, b:Int, fun:(Int,Int)=>Int):Int = fun(a,b)

  val sum = math(5, 6, (a,b) => a+b)
  val diff = math(10, 4, (a,b) => a-b)

  println(s"sum is $sum")
  println(s"diff is $diff")

}

输出。

sum是11
diff是6

在上面的例子中,我们定义了一个有三个参数的数学函数。第三个参数实际上是一个函数fun,它接收两个Int类型的参数,这个函数的返回类型也是Int。所以这里的数学函数实际上是一个高阶函数,因为它期待一个函数作为其第三个参数。这就是为什么当我们调用数学函数时,我们传递了一个匿名函数(需要两个参数)作为数学函数的第三个参数。

2.2.返回一个函数作为其结果的函数
object FunctionThatReturnsFunction extends App {

  def math(name: String): (Int, Int) => Int = (x: Int, y: Int) => {
    name match {
      case "add" => x + y
      case "product" => x * y
      case "divide" => x/y
      case "subtract" => x - y
    }
  }

  def add: (Int, Int) => Int = math("add")
  def sub: (Int, Int) => Int = math("subtract")
  def product: (Int, Int) => Int = math("product")
  def div: (Int, Int) => Int = math("divide")
  
  println(s"Addition of two numbers: ${add(5,8)}")
  println(s"Subtraction of two numbers: ${sub(15,8)}")
  println(s"Product of two numbers: ${product(5,8)}")
  println(s"Division of two numbers: ${div(16,8)}")
}

输出。

两个数字的加法。13
两个数字的减法。7
两个数字的积。40
两个数字的除法。2

在这个例子中,我们定义了一个数学函数,它以操作的名称作为参数,其返回类型为 **(Int, Int) => Int**.这意味着返回一个函数,它接收两个整数并返回一个整数。

Scala中常用的高阶函数

让我们来看看Scala中最常用的一些高阶函数。

1. map

map是一个将一个集合转化为另一个集合的函数,它对每个元素应用一个函数。我们的工作是描述如何转换每个元素。

它的签名如下。

例子。

注意:集合的类型保持不变,但元素的类型可能会改变。

2. flatMap

flatMap与map函数相同,但唯一不同的是,在flatMap中,一个项目的内部分组被移除,并生成一个序列。它可以被定义为map方法和flatten方法的混合体。

它有如下签名。

例子。

3.过滤

filter函数接收一个谓词,并从数据结构中选择满足给定谓词的元素。谓词是一个返回布尔值的单选函数。

过滤器函数看起来像。

例子。

4.减少

与前面的函数相比,reduce 是一个有点不同的函数。它接收一个集合中的所有元素,并通过二进制运算将它们结合起来,产生一个单一的值。

例子。

在这个例子中,我们有一个收入序列,我们想计算它们的总和。要做到这一点,我们需要提供一个更复杂的函数。该函数由两个元素组成:一个累积器 acc和一个当前元素 x

累积器负责保持 对我们的集合进行计算的状态

默认情况下,reduce调用reduceLeft,它从左到右遍历集合。如果我们想要颠倒顺序,我们可以使用reduceRight。

总结

在这篇博客中,我们已经了解了Scala中的高阶函数。它们相当强大,使我们能够编写简单、无模板、可读的代码。