Есть ли способ улучшить реализацию цикла for в Scala из Java? - PullRequest
0 голосов
/ 12 октября 2018

Я написал метод на 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.Это правильный путь для цикла for в Scala?

for (i <- Sales.Metrics.values().length) {
  val value: Sales.Metrics = Sales.Metrics.values()(i)
  if (!metricValue.isSet(value)) metricValue.setMetric(value, true)
}

Ответы [ 3 ]

0 голосов
/ 12 октября 2018
Sales.Metrics.values() foreach { value =>
   if (!metricValue.isSet(value)) metricValue.setMetric(value, true)
}

Я бы использовал здесь foreach , потому что вам нужен только побочный эффект.

В зависимости от реализации класса Metrics вам может понадобиться asScala -конвертер (см. import collection.JavaConverters._).

0 голосов
/ 12 октября 2018

Поскольку вы запрашивали функции языка Scala, вы можете рассмотреть возможность использования расширенных функций Scala, таких как «для понимания», для итераций по спискам на основе ваших требований.Обычно мы используем Scala For Compression для Yield, чтобы получить новый список с ожидаемым результатом.Условное ограждение также применяется так же, как и для каждого.

for {
  value <- Sales.Metrics.values()
  if !metricValue.isSet(value)
} yield metricValue.setMetric(value, true)
0 голосов
/ 12 октября 2018

Генератор i <- arr.length в вашем коде, похоже, не имеет никакого смысла.Выглядит так, как будто это должно быть что-то вроде

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

Замечания:

  1. В теле цикла foreach вы никогда не используете index ofзначение для чего-либо, вы используете только value.Следовательно, вам не нужно перебирать индексы, вы можете напрямую перебирать значения.
  2. Scala позволяет охранникам внутри for -выражений / for -loops,так что вы можете объединить Java for и if в одну управляющую структуру.

Также обратите внимание, что ваш исходный код Java также может быть переписан без явных индексов:

for (TypeOfValues v: Sales.Metrics.values()) {
    if (!metricValue.isSet(v)) {
        metricValue.setMetric(v, true);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...