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