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)
它看起来仍然很糟糕.
计算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)
蒂姆的答案是正确的,但我想补充一点,你真正想要的是一个表达式.你在这里说过,虽然你使用了"功能"这个词:
我可以用另一个功能复合的东西
但是,Scala已经基于表达式了,所以这实际上只是一个表达式:
{
val sum = x + y
if (sum > z) {
sum
} else if (sum < z) {
-1
} else {
0
}
}
Run Code Online (Sandbox Code Playgroud)
它返回要么sum,-1或0.您甚至可以println直接将此结果传递给您.实际上,这相当于您的原始代码:
println({
val sum = x + y
if (sum > z) {
sum
} else if (sum < z) {
-1
} else {
0
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
108 次 |
| 最近记录: |