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

时间:2020-02-23 14:37:31  来源:igfitidea点击:

今天,我们将学习如何使用Kotlin打印函数以及如何从控制台获取和解析用户输入。
此外,我们将研究Kotlin REPL。

Kotlin打印函数

要在屏幕上输出某些内容,请使用以下两种方法:

  • print()
  • println()

print语句将其中的所有内容打印到屏幕上。

println语句在输出末尾添加换行符。

打印语句内部调用System.out.print

以下代码显示了运行中的打印语句:

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")    
}

要在print语句中打印变量,我们需要在双引号字符串文字中使用美元符号($),后跟var/val名称。

要打印表达式的结果,我们使用${//表达式在这里}

下面是在Kotlin在线编译器上运行上述代码时的输出。

转义文字和表达式

要转义美元符号,并假设将${expression}仅当作字符串而不是对其进行计算,我们可以对其进行转义。

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")
}

注意,没有任何表达式/变量集的简单$会隐式地对其进行转义并将其仅视为字符串的一部分。

打印函数值

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)}"))    
}

注意:在另一个内部传递打印的行为类似于递归。
最里面的被首先打印。
打印语句返回一个"单位"(相当于Java中的void)。

Kotlin用户输入

要获取用户输入,可以使用以下两种方法:

  • readLine()
  • Scanner类

注意:用户输入需要命令行工具。
您可以使用REPL或者IntelliJ。
让我们在这里使用IntelliJ。

使用readLine()

readLine()返回字符串类型的值?为了处理在读取文件末尾等时可能发生的空值。

以下代码显示了使用readLine()的示例

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

如您所见,我们需要解开可空类型以在属性上使用String类型函数。
用一个 !!强制转换字符串?字符串,只有在您完全确定该值不会为null时。
否则会崩溃。

将输入转换为整数要将输入字符串转换为整数,我们执行以下操作:

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")
  }
}

再次,我们使用?.运算符使用totot()将可空类型转换为第一个Int。
然后我们乘以5。

连续读取输入我们可以使用do while循环来连续读取输入,如下所示。

do {
      line = readLine()

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

      println("Echo $line")

  } while (true)
}

上面在IntelliJ命令行中的输出如下。

使用拆分运算符读取多个值

我们可以读取多个由定界符分隔的值,并将它们保存为元组形式,如下所示。

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")
  }

}

" split"函数接受将成为分隔符的字符。
readIntegers()函数在分割上使用映射,将每个值转换为Int。
如果输入的值小于元组中指定的值,则会出现IndexOutOfBoundsException。
我们在两个输入中都使用了try-catch。

输出如下所示:

另外,代替元组,我们也可以使用一个列表,如下所示。

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

Kotlin扫描器类别

要接受输入,我们可以使用" Scanner(System.in)",它从标准输入键盘接受输入。
以下代码演示了相同的内容:

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

  //nextInt() reads the next integer. next() reads the String
  var integer:Int = reader.nextInt()

  println("You entered: $integer")

reader.nextInt()读取下一个整数。

reader.next()读取下一个字符串。
reader.nextFloat()读取下一个浮点数,依此类推。

reader.nextLine()将扫描程序传递到nextLine并清除缓冲区。

以下代码演示了如何直接在print语句中读取不同类型的输入。

import java.util.*

fun main(args: Array<String>) {

  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。

Kotlin REPL

REPL也称为Read-Eval-Print-Loop,用于直接在交互式shell中运行部分代码。
我们可以通过启动kotlin编译器在终端/命令行中执行此操作。

安装命令行编译器

如此处所示,我们可以在Mac/Windows/Ubuntu上安装命令行编译器。

通常,在Mac上,我们可以在终端上使用HomeBrew来安装kotlin编译器。

brew update
brew install kotlin

完成后,通过在终端/cmd中输入" kotlinc"来启动REPL。