如何在kotlin中进行多循环for循环

neh*_*joo 5 kotlin

在Java中:

for(int j = 0; j < 6 && j < ((int)abc[j] & 0xff); j++) { 
  // ...
}
Run Code Online (Sandbox Code Playgroud)

我们如何在Kotlin中制作这个循环?

gue*_*ter 9

我建议使用更实用的方法

(0..5).takeWhile {
    it < (abc[it].toInt() and 0xff) // or `as Int` if array is not numeric
}.forEach {
    // do something with `it`
}
Run Code Online (Sandbox Code Playgroud)


Bak*_*aii 5

如果您不介意创建新的ArrayList实例,可以这样进行:

(0..5).takeWhile { it < (abc[it] as Int and 0xff) }
        .forEach {
            // ...
        }
Run Code Online (Sandbox Code Playgroud)

  • 注意:在 forEach 的第一次迭代执行之前,整个范围由 takeWhile 处理。如果条件取决于迭代副作用,这将不起作用。 (2认同)

hot*_*key 5

注意:.takeWhile { ... }.forEach { ... }某些答案中建议的方法不等同于 Java for 循环。范围首先被处理,.takeWhile { ... }然后迭代它返回的前缀。问题是.forEach { ... }主体的执行不会影响 的条件.takeWhile { ... },当主体在第一项上被调用时,它已经完成了执行。

(请参阅此可运行的演示,其中显示了行为的不同之处)

要解决此问题,您可以使用Sequence<T>. 与预先评估相反Iterable<T>,它不会处理整个项目集,.takeWhile { ... }并且只会.forEach { ... }在处理下一个项目时一个一个地检查它们。请参阅:之间的区别Iterable<T>Sequence<T>

要使用Sequence<T>和 实现与 Java 循环等效的行为,请转换范围.toSequence()

(0..5).asSequence()
    .takeWhile { it < (abc[it].toInt() and 0xff) }
    .forEach {
        // Use `it` instead of `j`
    }
Run Code Online (Sandbox Code Playgroud)

或者,只需使用while循环:

var j = 0
while (j < 6 && j < (abc[j] as Int and 0xff)) {
    // do something
    j++
}
Run Code Online (Sandbox Code Playgroud)