不使用val存储值

HoT*_*icE 2 functional-programming scala

假设有3个数字:

val x = 10
val y = 5
val z = 14
Run Code Online (Sandbox Code Playgroud)

我们想要做一些逻辑:

if (x + y > z) {
  println(x + y)
} else if (x + y < z) {
  println(-1)
} else {
  println(0)
}
Run Code Online (Sandbox Code Playgroud)

如果我们的"z + y"操作很昂贵,我们必须完全计算一次:

val sum = x + y

if (sum > z) {
  println(sum)
} else if (sum < z) {
  println(-1)
} else {
  println(0)
}
Run Code Online (Sandbox Code Playgroud)

但我想要更多的功能方式:

if (x + y > z) => sum { //This is will not compile :)
  println(sum)
} else if (sum < z) {
  println(-1)
} else {
  println(0)
}
Run Code Online (Sandbox Code Playgroud)

没有需要另一个语句来存储结果的东西.我能用另一个功能复合的东西,比如:

if(x + y > z) sum {
  if(sum + 10 > 100) other_sum {
... etc
Run Code Online (Sandbox Code Playgroud)

PS.匹配没有帮助:

x + y match {
  case result if result > z => println(result)
  case result if result < z => println(-1)
  case _ => println(0)
}
Run Code Online (Sandbox Code Playgroud)

要么

val sum = x + y
sum match {
  case _ if sum > z => println(sum)
  case _ if sum < z => println(-1)
  case _ => println(0)
}
Run Code Online (Sandbox Code Playgroud)

它看起来仍然很糟糕.

Tim*_*Tim 5

计算sum临时变量的功能与其他解决方案相同.如果计算很复杂,那么您可以使用临时变量的名称来描述结果并使代码更具可读性.

如果你想用其他代码组合它,那么你可以轻松地将它包装在一个函数中.

编辑

这是避免临时变量的另一种方法,尽管它不一定比其他变量更好.

((sum: Int) =>
  if (sum > z) {
    println(sum)
  } else if (sum < z) {
    println(-1)
  } else {
    println(0)
  }) (x + y)
Run Code Online (Sandbox Code Playgroud)


Bri*_*hon 5

蒂姆的答案是正确的,但我想补充一点,你真正想要的是一个表达式.你在这里说过,虽然你使用了"功能"这个词:

我可以用另一个功能复合的东西

但是,Scala已经基于表达式了,所以这实际上只是一个表达式:

{
  val sum = x + y

  if (sum > z) {
    sum
  } else if (sum < z) {
    -1
  } else {
    0
  }
}
Run Code Online (Sandbox Code Playgroud)

它返回要么sum,-10.您甚至可以println直接将此结果传递给您.实际上,这相当于您的原始代码:

println({
  val sum = x + y

  if (sum > z) {
    sum
  } else if (sum < z) {
    -1
  } else {
    0
  }
})
Run Code Online (Sandbox Code Playgroud)