Я пытаюсь добавить очень полезный метод расширения к классу Java InputStream, поскольку мы знаем, что для анализа потока требуется несколько строк кода, и в моем приложении нам нужно обрабатывать поток несколько раз.
Пока чтомоя функция расширения работает, но она действительно очень полезна для некоторых недостатков, с которыми мы сталкиваемся при использовании функции основного языка kotlin.
Моя функция расширения для потока Java, принимающая определение метода с одним аргументом.
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
(ошибка времени компиляции)