在scala中返回函数的方法不清楚语法

时间:2018-04-21 11:30:45

标签: scala

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

我没有第一种方法来编写上述方法。 提前谢谢你

2 个答案:

答案 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是函数的输入