如何在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 }