函数字面量

33 阅读2分钟
object base44 {
    /*
    * 函数字面量
    * 另一种定义函数的方式
    */
    // 定义函数的方式一:def
    def getSum(x: Int, y: Int): Int = {
        x + y
    }
    
    // 定义函数的方式二:字面量
    val getSum1 = (x: Int, y: Int) => {
        x + y
    }
    
    def main(args: Array[String]): Unit = {
        println(getSum(10, 20))
        println(getSum1(10, 20))
    }
}

这段 Scala 代码展示了两种定义函数的方式:

方式一:使用 def 关键字(方法定义)

scala

def getSum(x: Int, y: Int): Int = {
    x + y
}

方式二:函数字面量(匿名函数)

scala

val getSum1 = (x: Int, y: Int) => {
    x + y
}

两种方式的区别:

  • def 定义的方法:是类的方法成员
  • 函数字面量:是 FunctionN trait 的实例,可以赋值给变量

两种方式在这个例子中都能正确计算两个整数的和,输出结果都是 30

函数字面里的简化写法

object base45 {
    /*
    # 替换字符串的简化写法
    * 1. 代码只有一句,省略 {}
    * 2. 使用 _ 占位符来替换形参
    */
    
    // 原始写法
    val getSum = (x: Int, y: Int) => {
        x * y
    }
    
    // 省略 {}(单行表达式)
    val getSum1 = (x: Int, y: Int) => x * y
    
    // 使用 _ 来代替形参(错误示例修正)
    val getSum2 = (_: Int) + (_: Int)
    
    // 使用 _ 来代替形参。 (Int, Int) => Int 就是getSum3的类型!
    val getSum3: (Int, Int) => Int = _ * _
    
    def main(args: Array[String]): Unit = {
        println(getSum(10, 20))    // 输出:200
        println(getSum1(10, 20))   // 输出:200
        println(getSum2(10, 20))   // 输出:30
        println(getSum3(10, 20))   // 输出:200
    }
}
object Main {
    /*
    * 把一个函数当做参数传递给另一个函数
    */
    
    // 定义两个函数值。(Int, Int) => Int 看成一种函数类型
    val f1: (Int, Int) => Int = _ + _
    // val a:Int = 1
    val f2: (Int, Int) => Int = _ * _
    
    // 定义一个函数,它有三个参数
    // 参数1:类型是 (Int, Int)=>Int,表示该参数需要一个函数
    def test(fn: (Int, Int) => Int, x: Int, y: Int): Int = { 
        fn(x, y)
    }
    
    def main(args: Array[String]): Unit = {
        println(test(f1, 10, 20))  // 相当于 f1(10,20) => 10 + 20 = 30
        println(test(f2, 10, 20))  // 相当于 f2(10,20) => 10 * 20 = 200
    }
}