有没有更好的方法在Scala中执行以下if/else处理?

del*_*ber 0 scala

我有一个事件驱动系统,响应交易如下

def onTrade {

    if (price > threshold) {
        processReject()
        return
    } 

    if (volume > threshold) {
        processReject()
        return
    } 
    .
    .
    .
}
Run Code Online (Sandbox Code Playgroud)

我以为我可以通过定义内部方法来语法上改进

def onTrade {

    def filterRemove = (filter: Boolean) => {
        if (filter) {
            processReject()
        }
        filter
    }

    val filters = List(
        filterRemove(price > threshold),
        filterRemove(volume > threshold),...
    )

    if (filters.filter(x => x == true).size > 0) return

}
Run Code Online (Sandbox Code Playgroud)

语法更清晰,特别是随着过滤器数量的增加.我遇到的一个问题是代码通过遍历每个单独的测试而不是在第一次失败时返回来浪费不必要的时钟周期.这有什么办法吗?例如,一旦filterRemove返回false,就退出onTrade.如果有一种更有表现力的方式来做到这一点,我也很想知道这一点.

par*_*tic 7

例如,您可以维护拒绝条件列表.然后你可以按顺序调用它们exists.一旦条件成立false,迭代就结束了.

这是一个小例子:

val conditions: List[() => Boolean] =
  List(
    () => price > threshold1,
    () => volume > threshold2
  )

def checkAndReject() = {
  val filter = conditions.exists( _() )
  if( filter ) processReject()
  filter
}
Run Code Online (Sandbox Code Playgroud)


Did*_*ont 6

如果你只是想在某些地方写条件,那么不仅仅是使用或者?它是半严格的

if (
  price > threshold1
  || volume > threshold2
  || ...
) {
   processReject()
   return
}
... proceed
Run Code Online (Sandbox Code Playgroud)