【发布时间】:2018-05-31 09:37:50
【问题描述】:
我正在尝试向 Java 的 InputStream 类添加一个非常有用的扩展方法,因为我们知道流解析需要几行样板代码,并且在我的应用程序中,我们需要多次处理流。
到目前为止,我的扩展功能可以正常工作,但是对于我们在使用 kotlin 核心语言功能时面临的一些缺点来说,它确实非常有用。
我对 Java Stream 的扩展函数接受单参数方法定义。
fun InputStream.forEachLine(consumer: (line: String)->Unit){
val reader = BufferedReader(InputStreamReader(this, Charset.defaultCharset()))
var line: String? = null
line = reader.readLine()
while (line != null) {
consumer(line)
line = reader.readLine()
}
}
//My Test is here
@Test
fun testExtnInputStreamForEachLine() {
val stream = FileInputStream(File("c:\temp\sometextfile.txt"))
stream.forEachLine {
println(it)
if(it.equals("some text")
// I want to break the whole forEachLine block
}
}
在上面的例子中,我有以下方法:
-
return@forEachLine(这对于跳过同一个块很有用 处理,类似于继续) - 创建了一个带有标签的
run块并尝试在其上返回。 (给出编译时错误) -
break@withLabel(编译时错误) - 更改了返回
boolean而不是Unit的方法并尝试返回false(编译时错误)
【问题讨论】:
-
你想做什么?要结束
print-ing 行,以防您发现一行等于“some text”? -
Kotlin 已经为
Reader类型定义了forEachLine扩展。你使用的是什么版本的 Kotlin? kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-reader/…
标签: lambda kotlin kotlin-extension