JRE 提供的一些标准接口是“空迭代器”(抱歉我不知道更好的名称),这意味着它们具有迭代器的粗略语义,只不过它们使用一个返回 null 来指示最后一个的方法。 item已经返回,例如ZipInputStream就提供了这样的接口:
ZipInputStream(stream).use { zip ->
while (true) {
val entry = zip.getNextEntry() ?: break
if (entry.name.endsWith(".txt"))
println(entry.name)
}
}
在 Kotlin 中,可以使用
while(true)
和带中断的 Elvis 运算符的组合来处理此类接口(如上所示)。
有没有一种“干净”/kotlin'ish的方法来消除
while(true)
,我可以想出几种方法来消除它,但是我不认为我的任何想法像上面的代码一样干净。
注意:我知道
ZipInputStream
有一个 available()
方法,我不是在寻找 ZipInputStream
的特定解决方案,而是一个适用于任何接口的通用解决方案,只有一个方法 - 返回 null表示最后一个项目已被处理。
generateSequence
的 lambda 参数具有相同的语义 - 当序列结束时返回 null
。
所以你可以这样做:
for (thing in generateSequence { getNextThing() }) {
// ...
}
其中
getNextThing
是您要调用的方法,它返回 null
来指示序列的结束。