Каков рецепт Scala для построчного чтения со стандартного ввода? Что-то вроде эквивалентного java-кода:
import java.util.Scanner;
public class ScannerTest {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
System.out.println(sc.nextLine());
}
}
}
java
scala
io
java.util.scanner
Андрей Чобану
источник
источник
scala.io.StdIn
Для консоли можно использовать
Console.readLine
. Вы можете написать (если хотите остановиться на пустой строке):Iterator.continually(Console.readLine).takeWhile(_.nonEmpty).foreach(line => println("read " + line))
Если вы отправляете файл для генерации ввода, вам может потребоваться остановиться либо на null, либо на пустом, используя:
@inline def defined(line: String) = { line != null && line.nonEmpty } Iterator.continually(Console.readLine).takeWhile(defined(_)).foreach(line => println("read " + line))
источник
takeWhile(_ != null)
Console.readLine
устарел, используйтеStdIn.readline
вместо него..takeWhile(Option(_).nonEmpty)
можете почувствовать себя лучше, если вы хотите полностью избежатьnull
ключевого слова.val input = Source.fromInputStream(System.in); val lines = input.getLines.collect
источник
io.Source.stdin
определен (вscala.io.Source
классе),def stdin = fromInputStream(System.in)
поэтому, вероятно, лучше придерживатьсяio.Source.stdin
.collect
метод изменен в этом ответе, поэтому вам нужно просто вызвать,input.getLines
который дает вамIterator
. Вы можете заставить его материализоваться с помощью.toStream
или.toList
на нем, в зависимости от варианта использования.Рекурсивная версия (компилятор обнаруживает хвостовую рекурсию для улучшения использования кучи),
def read: Unit = { val s = scala.io.StdIn.readLine() println(s) if (s.isEmpty) () else read }
Обратите внимание на использование
io.StdIn
из Scala 2.11. Также обратите внимание, что с помощью этого подхода мы можем накапливать вводимые пользователем данные в коллекции, которая в конечном итоге возвращается - в дополнение к распечатке. А именно,import annotation.tailrec def read: Seq[String]= { @tailrec def reread(xs: Seq[String]): Seq[String] = { val s = StdIn.readLine() println(s) if (s.isEmpty()) xs else reread(s +: xs) } reread(Seq[String]()) }
источник
Вы не можете использовать
var userinput = readInt // for integers var userinput = readLine ...
Как доступно здесь: Scaladoc API
источник
Как вкратце отмечено в других комментариях,
scala.Predef.readLine()
не рекомендуется, начиная с Scala 2.11.0, и вы можете заменить его наscala.io.StdIn.readLine()
:// Read STDIN lines until a blank one import scala.io.StdIn.readLine var line = "" do { line = readLine() println("Read: " + line) } while (line != "")
источник