干净的方式读取Kotlin中的所有输入行

时间:2018-12-01 21:08:26

标签: kotlin kotlin-native

进行编码挑战时的常见模式是读取多行输入。假设您事先不知道多少行,那么您要读取直到EOF(readLine返回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循环?

2 个答案:

答案 0 :(得分:3)

generateSequence具有很好的属性,如果内部生成器返回null并仅接受一次迭代,它将完成,因此以下代码可能有效:

Sequence<String>

然后像s1m0nw1's answer一样,可以使用任何可用的numTicks方法来根据您的解决方案进行调整。

答案 1 :(得分:2)

我猜您在这里谈论的是从System.in阅读?您可以使用序列进行操作:

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

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

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