在Java中:
for(int j = 0; j < 6 && j < ((int)abc[j] & 0xff); j++) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我们如何在Kotlin中制作这个循环?
我建议使用更实用的方法
(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)
如果您不介意创建新的ArrayList实例,可以这样进行:
(0..5).takeWhile { it < (abc[it] as Int and 0xff) }
.forEach {
// ...
}
Run Code Online (Sandbox Code Playgroud)
注意:.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)
| 归档时间: |
|
| 查看次数: |
762 次 |
| 最近记录: |