Scala:在条件中声明val

时间:2019-01-24 07:49:23

标签: scala

我有非常普通的用例。我有一个方法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

3 个答案:

答案 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"
}