我有非常普通的用例。我有一个方法conditionMethod
返回了Int
def conditionMethod(..):Int = {..}
现在我有if条件使用相同的方法
if (conditionMethod(..) > 0){
conditionMethod(..) + 23 // Any action
}
问题是两次调用方法conditionMethod。为了解决这个问题,另一种方法是
val tmp = conditionMethod(..)
if (tmp > 0){
tmp + 23 // Any action
}
在此我不喜欢的是我必须定义一个更大范围的变量。
我可以做类似的事情
if ((val tmp = conditionMethod(..)) > 0){ // tmp variable in if condition itself
tmp + 23 // Any action
}
Scala版本:2.11
答案 0 :(得分:10)
您可以将范围保持在严格范围内:
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script>
<link rel="stylesheet" href="//cdn.materialdesignicons.com/3.3.92/css/materialdesignicons.min.css">
<button id="lightbulb" data-on="false">
<span class="mdi mdi-lightbulb-outline"></span>
<span class="light-state">Light</span>
</button>
或使用val result = {
val tmp = methodCall()
if (tmp>0) tmp else tmp+23
}
match
答案 1 :(得分:7)
从Scala 2.13
开始,链接操作pipe
可用于转换/传递具有目标函数的值,从而避免使用中间变量:
import scala.util.chaining._
13.pipe(res => if (res > 0) res else res + 23 ) // 13
这实际上是match
语句的非常接近的变体,也可以这样写:
-27 pipe { case res if (res > 0) => res case res => res + 23 } // -4
答案 2 :(得分:3)
您可以fold
覆盖单个元素集合。
Seq(conditionMethod(..)).fold(0){case (z,x) =>
if (x>z) x+23 // any action as long as the result is an Int
else x
}
如果您的“操作”未产生Int
,则可以使用foldLeft
。返回String
也是一样。
Seq(conditionMethod(..)).foldLeft(""){case (_,x) =>
if (x>0) {
x+23 // any action as long as if/else types match
"string"
}
else "xxx"
}