Scala,用户输入,直到只给出换行符

Scala,用户输入,直到只给出换行符,scala,Scala,我已经尝试获取多个用户输入,以便在Scala IDE中打印它们 我已经试过了这段代码 println(scala.io.StdIn.readLine()) 这是可行的,因为IDE接受我的输入,然后在行中打印它,但这只适用于单个输入。 我希望代码接受多个输入,直到只输入换行符。例如 1 2 3 所以我决定输入需要一个迭代器,这让我分别尝试了下面两行代码 var in = Iterator.continually{ scala.io.StdIn.readLine() }.takeWhile {

我已经尝试获取多个用户输入,以便在Scala IDE中打印它们

我已经试过了这段代码

println(scala.io.StdIn.readLine())
这是可行的,因为IDE接受我的输入,然后在行中打印它,但这只适用于单个输入。 我希望代码接受多个输入,直到只输入换行符。例如

1
2
3
所以我决定输入需要一个迭代器,这让我分别尝试了下面两行代码

var in = Iterator.continually{ scala.io.StdIn.readLine() }.takeWhile { x => x != null}

不幸的是,它们都没有工作,因为IDE根本没有接受我的输入。

你真的很接近了

val in = Iterator.continually(io.StdIn.readLine).takeWhile(_.nonEmpty).toList
这将读取输入,直到输入空字符串,并将输入保存在列表[字符串]中。之所以使用toList,是因为迭代器元素在调用next之前不会变为实元素,所以在需要下一个元素之前不会调用readLine。到列表的转换将创建迭代器的所有元素

更新

正如@vossad01所指出的,对于意外输入,这可以变得更安全

val in = Iterator.continually(io.StdIn.readLine)
                 .takeWhile(Option(_).fold(false)(_.nonEmpty))
                 .toList

您的程序是期望/处理一次所有的行,还是需要迭代器的惰性语义?它应该期望一次处理所有的行。不是一行,而是用户输入的多行。非常感谢。我在过去的一个小时里一直在寻找这个。我不知道toList部分。应该是。takeWhiles=>s!=null&&s。非空。否则,如果在遇到空行之前遇到流的结尾,您将抛出NullPointerException。@vossad01,到目前为止,我无法从StdIn.readLine获取null或EOL。这是如何做到的?在Linux上,从输入读取时是Ctrl+D。我不确定其他地方。当StdIn从另一个命令通过管道传输或从文件读取时,也会遇到这种情况。@vossad01,明白了。REPL正在捕获/缓冲Ctrl-D输入。从shell运行和从shell输入确实会在Ctrl-D输入时返回NPE。更新。
val in = Iterator.continually(io.StdIn.readLine)
                 .takeWhile(Option(_).fold(false)(_.nonEmpty))
                 .toList