我如何将以下Java反向计数循环转换为Scala?

del*_*ber 8 scala

以下Java代码是一段非常简单的代码,但Scala中的等效构造是什么?

for (int i=10; i> 0; i-=2) {
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 24

答案取决于您是否还需要代码与Java中一样快.

如果您只是想让它起作用,您可以使用:

for (i <- 10 until 0 by -2) println(i);
Run Code Online (Sandbox Code Playgroud)

(这until意味着省略最后的条目,并且to意味着包括最终条目,就像你使用>>=).

但是,这会有一些适度的开销; 该for循环是Scala比Java中的一个更一般的结构,尽管它可能在原则上进行优化,在实践中还没有(不通过2.9核心分布;在ScalaCL插件可能会优化它适合你,不过) .

对于println,打印将比循环花费更长的时间,所以没关系.但是在一个你知道是性能瓶颈的紧密循环中,你需要使用while循环:

var i = 10
while (i > 0) {
  println(i)
  i -= 2
}
Run Code Online (Sandbox Code Playgroud)


sep*_*p2k 7

要在Scala中以2为步长从10迭代到0(不包括),您可以使用untilby方法创建一个Range ,然后在for循环中迭代它们:

for(i <- 10 until 0 by -2)
Run Code Online (Sandbox Code Playgroud)


use*_*own 5

当然你也可以这样做:

(0 to 4).map (10 - 2 * _)
Run Code Online (Sandbox Code Playgroud)

要么

List(10, 8, 6, 4, 2) foreach println
Run Code Online (Sandbox Code Playgroud)

或者怎么样

(2 to 10 by 2).reverse
Run Code Online (Sandbox Code Playgroud)