有没有一种方法可以从Java改进Scala中的for循环实现

时间:2018-10-12 13:54:46

标签: java scala loops enums

我已经用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)
}

3 个答案:

答案 0 :(得分:3)

代码中的生成器i <- arr.length似乎没有任何意义。看起来好像应该是

for (value <- Sales.Metrics.values() if !metricValue.isSet(value)) {
  metricValue.setMetric(value, true)
}

备注:

  1. 在foreach循环的主体中,您永远不会对任何值使用值的 index ,而仅使用value。因此,您不必遍历索引,可以直接遍历值。
  2. Scala允许在for表达式/ for循环内使用guards,因此您可以将Java的forif组合成一个控制结构。 / 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)