你可以颠倒你的逻辑。重要的是,一切都在use
否则,正如您所知,这将不起作用。
一种这样的 ~invert 可能看起来像:
setOf("file1.txt", "file2.txt")
.map { MyFile::class.java.getResourceAsStream(it) }
.flatMap {
it.use {
it.bufferedReader(Charsets.UTF_8)
.lineSequence()
.filterNot { it.startsWith("#") }
.toSet()
}
}
或者,如果您想从外部传递链转换或过滤器,可能类似于:
val handleLine : (Sequence<String>) -> Sequence<String> = {
it.filterNot { it.startsWith("#") }
// .map { ... whatever }
}
setOf("file1.txt", "file2.txt")
.map { MyFile::class.java.getResourceAsStream(it) }
.flatMap {
it.use {
handleLine(it.bufferedReader(Charsets.UTF_8).lineSequence())
.toSet()
}
}
另一种选择是打开流,省略use
最后自己关闭它们,正如 @MarkoTopolnik 在评论中指出的那样:
val inputStreams = sequenceOf("file1.txt", "file2.txt")
.map { MyFile::class.java.getResourceAsStream(it) }
inputStreams.flatMap { it.bufferedReader(Charsets.UTF_8).lineSequence() }
.filterNot { it.startsWith("#") }
.toSet()
然后使用:
inputStreams.forEach(InputStream::close) // but this will fail on the first error...
或“安全”方式:
inputStreams.forEach { try { it.close() } catch (e: Exception) { e.printStackTrace() } }