我是Scala的新手,但我已经使用Java很长一段时间了,所以编程对我来说并不陌生。 无论如何,我读了一些关于Scala的书籍,并且遇到了一个方法返回函数的例子。现在从方法返回一个函数并不新,因为Java 8支持lambda表达式但是我不能理解下面的例子:
def lowIt(inputValue: String): Double => Double = {
if (inputValue == "Lower") x => x * 0.85
else x => x
}
我不明白x的来源,我希望如下:
def lowIt(inputValue: String): Double => Double = x => {
if (inputValue == "Lower") x * 0.85
else x
}
我没有第一种方法来编写上述方法。 提前谢谢你
答案 0 :(得分:2)
如果你看起来更直观,你可以从第二个版本开始:它的行为与第一个版本相同。但是,如果你仔细观察它,你会注意到闭包捕获的inputValue
永远不会改变,所以你的功能
x => { if (inputValue == "Lower") x * 0.85 else x }
始终采用then
- 分支或else
- 分支。但是,您不必为每个if-else
进行x
比较。相反,您可以一次做出决定。
如果inputValue == "Lower"
成立,您的功能将变为
x => { if (true) x * 0.85 else x }
x => x * 0.85
_ * 0.85
在inputValue != "Lower"
的情况下,您的功能只是
x => { if (false) x * 0.85 else x }
x => x
identity
因此,从您自己的版本开始,在几个简单的重写步骤之后,该函数被简化为
def lowIt(inputValue: String): Double => Double = {
if (inputValue == "Lower") x => x * 0.85
else x => x
}
甚至更短:
def lowIt(inputValue: String): Double => Double = {
if (inputValue == "Lower") _ * 0.85
else identity
}
重写的版本效率更高,因为每次都不需要评估if
。最后一个版本甚至可能更清晰一点,因为identity
- 函数被写为一个不可简化的东西"可以退货。
答案 1 :(得分:1)
你可以像这样重写那个函数:
def lowIt(inputValue: String): Double => Double = {
if (inputValue == "Lower") {(x: Double) => x * 0.85 }
else {(x: Double) => x}
}
2个返回值是函数,x
是函数的输入