Kotlin print(), println(), readLine(), Scanner, REPL

Hoje vamos aprender como usar as funções de impressão do Kotlin e como obter e analisar a entrada do usuário no console. Além disso, vamos explorar o Kotlin REPL.

Funções de Impressão do Kotlin

Para exibir algo na tela, são usados os seguintes dois métodos:

  • print()
  • println()

A instrução print imprime tudo que está dentro dela na tela. A instrução println anexa uma nova linha ao final da saída. As instruções de impressão chamam internamente System.out.print. O código a seguir mostra as instruções de impressão em ação:

fun main(args: Array<String>) {
var x = 5
print(x++)
println("Hello World")
print("Do dinasours still exist?\n")
print(false)
print("\nx is $x.")
println(" x Got Updated!!")
print("Is x equal to 6?: ${x == 6}\n")    
}

Para imprimir uma variável dentro da instrução de impressão, precisamos usar o símbolo de dólar($) seguido pelo nome da var/val dentro de uma string literal entre aspas duplas. Para imprimir o resultado de uma expressão, usamos ${ //expressão aqui }. A saída ao executar o código acima no Kotlin Online Compiler é mostrada abaixo.

Escanear literais e expressões

Para escapar do símbolo de dólar e, digamos, tratar ${expressão} apenas como uma string, em vez de calculá-la, podemos escapá-lo.

fun main(args: Array<String>) {
val y = "\${2 == 5}"
println("y = ${y}")       
println("Do we use $ to get variables in Python or PHP? Example: ${'$'}x and ${'$'}y")
val z = 5
var str = "$z"
println("z is $str")
str = "\$z"
println("str is $str")
}

Observe que um simples $ sem nenhuma expressão/variável definida implicitamente o escapa e o trata apenas como parte da string.

Valores da função de impressão

fun sumOfTwo(a: Int, b: Int) : Int{
    return a + b
}

fun main(args: Array<String>) {
val a = 2
val b = 3
println("Value of ${'$'}a and ${'$'}b is : ${sumOfTwo(a,b)}") 
println(println("Printing Value of ${'$'}a and ${'$'}b is : ${sumOfTwo(a,b)}"))    
}

A seguinte saída é impressa: Nota: Passar um print dentro de outro se comporta como recursão. O mais interno é impresso primeiro. A instrução de impressão retorna uma Unit (equivalente a void em Java).

Entrada do Usuário em Kotlin

Para obter a entrada do usuário, os seguintes dois métodos podem ser usados:

Nota: A entrada do usuário requer uma ferramenta de linha de comando. Você pode usar o REPL ou o IntelliJ. Vamos usar o IntelliJ aqui.

Usando readLine()

readLine() retorna o valor do tipo String? para lidar com valores nulos que podem ocorrer ao ler o final do arquivo, etc. O código a seguir mostra um exemplo usando readLine()

fun main(args: Array<String>) {
    println("Enter your name:")
    var name = readLine()
    print("Length is ${name?.length}")
}

Como você pode ver, precisamos desembrulhar o tipo anulável para usar as funções do tipo String na propriedade. Use !! para converter forçadamente o String? em String, apenas quando tiver certeza absoluta de que o valor não será nulo. Caso contrário, ocorrerá uma falha. Convertendo a entrada para um Integer Para converter a String de entrada em um Int, fazemos o seguinte:

fun main(args: Array<String>) {
var number = readLine()
try {
        println("Number multiply by 5 is ${number?.toInt()?.times(5)}")
    } catch (ex: NumberFormatException) {
        println("Number not valid")
    }
}

Novamente, usamos o operador ?. para converter o tipo anulável primeiro para um Int usando toInt(). Em seguida, multiplicamos por 5. Lendo a entrada continuamente Podemos usar o loop do while para ler a entrada continuamente, como mostrado abaixo.

    do {
        line = readLine()

        if (line == "quit") {
            println("Closing Program")
            break
        }

        println("Echo $line")

    } while (true)
}

A saída do código acima no IntelliJ Command Line é mostrada abaixo.

Lendo Múltiplos Valores usando o operador de divisão

Podemos ler múltiplos valores separados por delimitadores e salvá-los em forma de tupla, como mostrado abaixo.

fun readIntegers(separator: Char = ',')
        = readLine()!!.split(separator).map(String::toInt)

fun main(args: Array<String>) {
    println("Enter your values:")
    try {
        val (a, b, c) = readLine()!!.split(' ')
        println("Values are $a $b and $c")
    } catch (ex: IndexOutOfBoundsException) {
        println("Invalid. Missing values")
    }

    try {
        val (x, y, z) = readIntegers()
        println("x is $x y is $y z is $z")
    } catch (ex: IndexOutOfBoundsException) {
        println("Invalid. Missing values")
    }
    catch (ex: NumberFormatException) {
        println("Number not valid")
    }

}

A função `split` recebe o caractere que será o delimitador. A função `readIntegers()` utiliza um mapeamento em um split para converter cada valor em um Inteiro. Se você inserir valores menores do que o especificado na tupla, você receberá uma IndexOutOfBoundsException. Nós utilizamos try-catch em ambas as entradas. A saída se parece com isso: Alternativamente, ao invés de tuplas, também podemos utilizar uma lista como mostrado abaixo.

val ints: List<String>? = readLine()?.split("|".toRegex())
println(ints)

Classe Scanner Kotlin

Para receber entradas, podemos utilizar `Scanner(System.`in`)`, que recebe entradas do teclado de entrada padrão. O código a seguir demonstra o mesmo:

fun main(args: Array) {
    val reader = Scanner(System.`in`)
    print("Enter a number: ")

    // nextInt() lê o próximo inteiro. next() lê a String
    var integer:Int = reader.nextInt()

    println("You entered: $integer")

reader.nextInt() lê o próximo inteiro. reader.next() lê a próxima String. reader.nextFloat() lê o próximo float e assim por diante. reader.nextLine() passa o Scanner para a próxima linha e também limpa o buffer. O código a seguir demonstra a leitura de diferentes tipos de entradas dentro de um comando de impressão diretamente.

import java.util.*

fun main(args: Array) {

    val reader = Scanner(System.`in`)
    print("Enter a number: ")

    try {
        var integer: Int = reader.nextInt()
        println("You entered: $integer")
    } catch (ex: InputMismatchException) {
        println("Enter valid number")
    }
    enterValues(reader)
    //move scanner to next line else the buffered input would be read for the next here only.
    reader.nextLine()
    enterValues(reader)
}

fun enterValues(reader: Scanner) {
    println("Enter a float/boolean :")
    try {
        print("Values: ${reader.nextFloat()}, ${reader.nextBoolean()}")
    } catch (ex: InputMismatchException) {
        println("First value should be a float, second should be a boolean. (Separated by enter key)")
    }
}

InputMismatchException é lançada quando a entrada é de um tipo diferente do solicitado. A saída é apresentada abaixo.

REPL Kotlin

REPL, também conhecido como Read-Eval-Print-Loop, é usado para executar uma parte do código em um shell interativo diretamente. Podemos fazer isso em nosso terminal/linha de comando iniciando o compilador Kotlin.

Instalando o Compilador de Linha de Comando

Podemos instalar o compilador de linha de comando no Mac/Windows/Ubuntu conforme demonstrado aqui. Tipicamente, em um Mac, podemos usar o HomeBrew em nosso terminal para instalar o compilador Kotlin.

brew update
brew install kotlin

Assim que estiver pronto, inicie o REPL digitando kotlinc em seu terminal/cmd. A seguir está o meu primeiro código no REPL. Isso é tudo para as funções de impressão do Kotlin e uma rápida introdução ao REPL Kotlin.

Source:
https://www.digitalocean.com/community/tutorials/kotlin-print-println-readline-scanner-repl