在Scala中是否可以简化以下if / else语句?

时间:2011-08-19 02:35:17

标签: scala

我正试图存储最高价格。还有一些其他的业务规则,但三个嵌套的if语句看起来非常程序化和混乱。我想知道是否有更好的功能方式来表达以下逻辑。

val sunsetTime1 = "14:00:00.000"
val maxPrices = new HashMap[String, Double]

if (trade.dateTime.before(time1)) {
  if (maxPrices.contains(sunsetTime1)) {
    if (maxPrices(sunsetTime1) < trade.price) {
      maxPrices.put(sunsetTime1, price)
    }
  }
  else {
    maxPrices.put(sunsetTime1, price)
  }

}

3 个答案:

答案 0 :(得分:7)

声明(外部if,我忽略)的形式为:

if (a) 
  if (b) 
    c
else 
  c 

在组合表中,我们可以写出来:

      a
   | t| f
  --------
  t| c| c
b --------
  f| -| c

如果a为假(右列),我们独立于a执行c。如果a为真,我们进行b检验,只有当b为真时才进行c。

我们可以把它写成

if (! (a && !b)) c

if (!a || b) c

最后一种形式更简洁,但功能更强大? 感谢评论中的更正。如有疑问,请使用测试用例,或采用更长的形式。

答案 1 :(得分:7)

我不是Scala专家,您应该检查该代码,但我猜模式匹配和选项更像是Idiomatic Sc​​ala。

if (trade.dateTime.before(time1)) {
  maxPrices.get(sunsetTime1) match {
    case Some(oldPrice) if oldPrice < trade.price => maxPrices.put(sunsetTime1, price)
    case None => maxPrices.put(sunsetTime1, price)
  }
}

干杯。

答案 2 :(得分:3)

我在Scala中缺乏经验,但我的函数式编程直觉告诉我这样的事情:

if (trade.dateTime.before(time1)) {
  maxPrices get(sunsetTime1) 
  filterNot ( _ < trade.price ) 
  orElse ( maxPrices.put(sunsetTime1, price) )
}

AFAIK,与原始版本的唯一区别在于,如果地图中已经有更高的价格,它会返回旧值而不是AnyVal。

(如果任何真正的Scalistas不同意这一点,请随时发表评论。)