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

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

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

Ответы [ 3 ]

23 голосов
/ 19 июля 2011

Ответ зависит от того, нужен ли вам код так же быстро, как это было в 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
}
7 голосов
/ 19 июля 2011

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

for(i <- 10 until 0 by -2)
5 голосов
/ 19 июля 2011

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

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

или

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

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

(2 to 10 by 2).reverse
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...