在 Kotlin 中读取所有输入行的简洁方法

Clean way of reading all input lines in Kotlin

进行编码挑战时的一个常见模式是阅读多行输入。假设你事先不知道有多少行,你想读到 EOF (readLine returns null).

另外作为序言,我不想依赖 java.utils。* 因为我在 KotlinNative 中编码,所以没有 Scanner。

我可能会做类似的事情

val lines = arrayListOf<String>()
for (var line = readLine(); line != null; line = readLine()) {
    lines.add(line)
}

但这显然不是有效的 Kotlin。我能想到的最干净的是:

while (true) {
    val line = readLine()
    if (line == null) break
    lines.add(line)
}

这行得通,但它似乎不是很地道。有没有更好的方法可以在不使用 while/break 循环的情况下将所有行读入数组?

我猜你是在谈论阅读 System.in 的内容?您可以使用序列来实现:

val lines = generateSequence(readLine()) {
    readLine()
}

lines.take(5).forEach { println("read: $it") }

我们从第一个 readLine(序列的种子)开始我们的序列,然后读取下一行直到遇到 null。该序列可能是无限的,因此我们只采用示例中的前五个输入。阅读有关 Sequence here.

的详细信息

generateSequence 有很好的 属性 如果内部生成器 returns null 并且只接受一次迭代,它将完成,所以下面的代码可能是有效的:

val input = generateSequence(::readLine)
val lines = input.toList()

然后像 一样,您可以使用任何可用的 Sequence<String> 方法根据您的解决方案的需要对其进行优化。