用策略模式替换条件逻辑

问题描述 投票:0回答:1

我有一个很长的条件逻辑。希望有一个有效的方法。

(city, country) match {

("USA","NewYork") => someVal=1.0
("USA","SomeOther")=> someVal =2.0
....
}

我在循环中有这个查找逻辑,我该怎么做。可能是Scala中的多键映射或策略模式

scala strategy-pattern multikey
1个回答
0
投票

您有一些方法可以做到。除了使用的一种用途,您还可以尝试:

val map1: Map[(String, String), Double]
map1((country, city)): Double // or
map1.get((country, city)): Option[Double]

val map2: Map[String, Map[String, Double]]
map2(country)(city): Double
map2.get(country).flatMap(_.get(city)): Option[Double]

哪个更快?我不知道。您将必须为您的用例制定基准。 Map可能比match快,但没有基准,没人能说出多少。哪个地图更快? map1map2?我们可能会猜测,但没有针对您的用例的基准,只是猜测。

不幸的是,直到您以JMH之类运行它并比较结果之前,它可能只是冷JVM的结果。

而且,只要您将String用作键,就很难建议诸如Strategy之类的解决方案或GoF中的任何内容,因为它们依赖于能够向该类添加某些属性/方法的原因使计算更便宜和/或基于有限数量的可能性可以解锁某些优化这一事实。

© www.soinside.com 2019 - 2024. All rights reserved.