如何在kotlin中进行多条件循环

在Java中:

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

我们如何能在Kotlin中实现这个循环?

我建议使用更多功能的方法

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

如果你不介意创建一个新的ArrayList实例,可以这样做:

 (0..5).takeWhile { it < (abc[it] as Int and 0xff) } .forEach { // ... } 

注意:某些答案中提出的.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` } 

另外,只需使用while循环:

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

这就是kotlin版本的样子。

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

您可以在这里将Java转换为Kotlin。 尝试Kotlin 。 另外如果你使用的是IntelliJ,这里有一个链接可以帮助你从Java转换到Kotlin。 IntelliJ Java到Kotlin。

这是intellij插件转换的输出:

  var j = 0 while (j < 6 && j < abc[j] as Int and 0xff) { j++ // ... } 

我会将j < ((int)abc[j] & 0xff)部分移到循环内部的if-test中。 你可以这样做:

 for (j in 0..5) { if (j < (abc[j].toInt() and 0xff)) { // Do stuff here } else break }