una - programa para leer lineas de codigo en java




¿Cómo leer desde la entrada estándar línea por línea? (4)

¿Cuál es la receta de Scala para leer línea por línea de la entrada estándar? Algo así como el código Java equivalente:

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());
        }
    }
}

El enfoque más sencillo simplemente usará readLine() que es parte de Predef . sin embargo, eso es bastante feo, ya que necesita verificar el posible valor nulo:

object ScannerTest {
  def main(args: Array[String]) {
    var ok = true
    while (ok) {
      val ln = readLine()
      ok = ln != null
      if (ok) println(ln)
    }
  }
}

esto es muy detallado, preferiría usar java.util.Scanner lugar.

Creo que un enfoque más bonito usará scala.io.Source :

object ScannerTest {
  def main(args: Array[String]) {
    for (ln <- io.Source.stdin.getLines) println(ln)
  }
}

No puedes usar

var userinput = readInt // for integers
var userinput = readLine 
...

Como está disponible aquí: Scaladoc API


Una versión recursiva (el compilador detecta una recursividad de cola para un uso mejorado del montón),

def read: Unit = {
  val s = scala.io.StdIn.readLine()
  println(s)
  if (s.isEmpty) () else read 
}

Tenga en cuenta el uso de io.StdIn de Scala 2.11. También tenga en cuenta que con este enfoque podemos acumular la entrada del usuario en una colección que finalmente se devuelve, además de imprimirse. A saber,

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]())
}

val input = Source.fromInputStream(System.in);
val lines = input.getLines.collect




java.util.scanner