我正试图存储最高价格。还有一些其他的业务规则,但三个嵌套的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)
}
}
答案 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 Scala。
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不同意这一点,请随时发表评论。)