Как бы я перевел следующий цикл обратного отсчета 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