Scala方法返回函数语法疑问:Lambda参数x的来源不解
lowIt为例 作为有多年Java开发经验的老手,刚接触Scala的函数式语法时,遇到这种方法返回函数的写法确实容易卡壳——我当初入门时也纠结过类似的点!咱们一步步拆解这个示例,把它和你熟悉的Java Lambda对应起来,就清晰了:
先看方法的返回类型
首先看方法定义:
def lowIt(inputValue: String): Double => Double = { // ... 方法体 }
这里的Double => Double是Scala的函数类型,它的意思是:一个接受Double类型参数、返回Double类型结果的函数。对应到Java里,就是Function<Double, Double>这个函数式接口。
拆解方法体里的函数字面量
方法体里的逻辑是根据inputValue返回两个不同的匿名函数:
- 当
inputValue == "Lower"时,返回x => x * 0.85 - 否则返回
x => x
这里的x就是匿名函数自己的参数,和你在Java里写Lambda时的参数是一个意思!
对比Java的等价写法
如果用Java写同样的逻辑,会是这样:
import java.util.function.Function; public Function<Double, Double> lowIt(String inputValue) { if ("Lower".equals(inputValue)) { // 这里的x就是Lambda的参数,和Scala里的x完全对应 return x -> x * 0.85; } else { return x -> x; } }
是不是瞬间熟悉了?Scala只是把Java Lambda的(x) -> ...简化成了x => ...,而且因为方法已经声明了返回类型是Double => Double,Scala可以自动推断出x的类型是Double,不用像Java那样有时候需要显式写(Double x)。
补充:为什么你会觉得“x的来源不清楚”
可能是因为Scala的语法更紧凑,把函数定义和返回逻辑放在了一起。换个写法,把两个匿名函数单独拎出来,你就更能看清楚x的归属:
def lowIt(inputValue: String): Double => Double = { // 定义两个命名函数,x是它们的参数 val discountFunc: Double => Double = x => x * 0.85 val identityFunc: Double => Double = x => x if (inputValue == "Lower") discountFunc else identityFunc }
这里的x分别属于discountFunc和identityFunc,是这两个函数的输入参数,和外部的inputValue没有关系——只是Scala允许我们把函数定义直接写在返回语句里,省去了命名的步骤。
简单来说:x => ...就是在定义一个新的函数,x是这个函数要接收的参数,它的“来源”就是你调用这个返回的函数时传入的值。比如你调用lowIt("Lower")(100),这里的100就是传给x的实际值,结果会是85.0。
内容的提问来源于stack exchange,提问作者user1409534

