Как перевести следующий цикл обратного отсчета Java в Scala?

Следующий код Java - очень простая часть кода, но каковы эквивалентные конструкции в Scala?

for (int i=10; i> 0; i-=2) {
    System.out.println(i);
}

Ответ 1

Ответ зависит от того, нужен ли вам код так же быстро, как и на Java.

Если вы просто хотите, чтобы он работал, вы можете использовать:

for (i <- 10 until 0 by -2) println(i);

(где until означает опустить окончательную запись, а to означает включение окончательной записи, как если бы вы использовали > или >=).

Однако для этого будут некоторые скромные накладные расходы; цикл for является более общей конструкцией в Scala, чем в Java, и хотя он может быть оптимизирован в принципе, на практике он еще не (не в основном распределении через 2.9; плагин ScalaCL, вероятно, оптимизирует его для вас, однако).

Для println печать займет гораздо больше времени, чем цикл, так что все в порядке. Но в узком круге, который, как вы знаете, является узким местом производительности, вам нужно использовать вместо этого циклы:

var i = 10
while (i > 0) {
  println(i)
  i -= 2
}

Ответ 2

Чтобы итератировать от 10 до 0 (исключая) с шагом 2 в Scala, вы можете создать диапазон с помощью методов until и by, а затем перебрать их в цикле for:

for(i <- 10 until 0 by -2)

Ответ 3

Конечно, вы тоже можете сделать:

(0 to 4).map (10 - 2 * _)

или

List(10, 8, 6, 4, 2) foreach println

или как насчет

(2 to 10 by 2).reverse