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
}
}