我已经用Java编写了一个方法,我想将其重写为Scala。 (Sales.Metrics是Enum
)
for (int i = 0; i < Sales.Metrics.values().length; i++) {
Sales.Metrics value = Sales.Metrics.values()[i];
if (!metricValue.isSet(value)) {
metricValue.setMetric(value, true);
}
}
所以我想出了以下实现,但我怀疑它可能不是最佳的。也许我缺少一些很棒的Scala功能。在Scala中使用for循环是正确的方法吗?
for (i <- Sales.Metrics.values().length) {
val value: Sales.Metrics = Sales.Metrics.values()(i)
if (!metricValue.isSet(value)) metricValue.setMetric(value, true)
}
答案 0 :(得分:3)
代码中的生成器i <- arr.length
似乎没有任何意义。看起来好像应该是
for (value <- Sales.Metrics.values() if !metricValue.isSet(value)) {
metricValue.setMetric(value, true)
}
备注:
value
。因此,您不必遍历索引,可以直接遍历值。for
表达式/ for
循环内使用guards,因此您可以将Java的for
和if
组合成一个控制结构。 / li>
还要注意,您的原始Java代码也可以在没有显式索引的情况下进行重写:
for (TypeOfValues v: Sales.Metrics.values()) {
if (!metricValue.isSet(v)) {
metricValue.setMetric(v, true);
}
}
答案 1 :(得分:1)
Sales.Metrics.values() foreach { value =>
if (!metricValue.isSet(value)) metricValue.setMetric(value, true)
}
我会在这里使用 foreach ,因为您需要的只是副作用。
根据Metrics
类的实现,您可能需要asScala
-converter(请参阅import collection.JavaConverters._
)。
答案 2 :(得分:1)
当您要求使用Scala语言功能时,可以考虑使用scala高级功能(例如“理解”)根据您的要求遍历列表。正常情况下,我们使用带有收益的Scala理解来产生具有预期结果的新列表。 条件保护也与每个方法中的应用相同。
for {
value <- Sales.Metrics.values()
if !metricValue.isSet(value)
} yield metricValue.setMetric(value, true)