Я часто сталкиваюсь с этой проблемой, но не вижу общей реализации: как мне идиоматически (функционально) найти элемент, остановить поиск после совпадения, а также вернуть другой тип (т. Е. Сопоставить любое совпадение с другим типом)?
Я смог сделать обходной путь с
fun <F,T> Sequence<F>.mapFirst(block: (F) -> T?): T? =
fold(AtomicReference<T>()) { ref, from ->
if (ref.get() != null) return@fold ref
ref.set(block(from))
ref
}.get()
fun main() {
Files.list(someDir).asSequence().map { it.toFile() }.mapFirst { file ->
file.useLines { lines ->
lines.mapFirst { line ->
if (line == "123") line.toInt() else null
}
}
}?.let { num ->
println("num is $num") // will print 123 as an Int
} ?: println("not a single file had a line eq to '123'")
}
Но это не останавливается на совпадении (когда block()
возвращает ненулевое значение) и использует все файлыи все их линии.