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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

или же

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

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

(2 to 10 by 2).reverse
Другие вопросы по тегам