Kotlin基础教程:全面解析print()、println()、readLine()、Scanner与REPL输入输出功能

这是文章《Kotlin的print()、println()、readLine()、Scanner、REPL的功能详解》的第1部分(共1部分)。

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

Kotlin 打印函数

在屏幕上输出内容使用以下两种方法:

  • print()
  • println()

print语句将其内部的所有内容打印到屏幕上。println语句在输出末尾追加一个换行符。print语句在内部调用System.out.print。以下代码展示了print语句的示例。

fun main(args: Array<String>) {
var x = 5
print(x++)
println("你好,世界")
print("恐龙还存在吗?\n")
print(false)
print("\nx 的值是 $x。")
println(" x 已更新!!")
print("x 等于 6 吗?: ${x == 6}\n")    
}
kotlin print println 函数示例

转义字面量和表达式

为了逃避美元符号,并且将${expression}仅视为字符串而非计算式,我们可以对其进行转义处理。

fun main(args: Array<String>) {
val y = "\${2 == 5}"
println("y = ${y}")       
println("我们在Python或PHP中使用$来获取变量吗?例如:${'$'}x 和 ${'$'}y")
val z = 5
var str = "$z"
println("z 的值是 $str")
str = "\$z"
println("str 的值是 $str")
}
kotlin print 语句转义字面量

打印函数的值

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

fun main(args: Array<String>) {
val a = 2
val b = 3
println("${'$'}a 和 ${'$'}b 的值是 : ${sumOfTwo(a,b)}") 
println(println("打印 ${'$'}a 和 ${'$'}b 的值是 : ${sumOfTwo(a,b)}"))    
}
kotlin print 语句打印函数值

Kotlin 用户输入

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

  • readLine()
  • Scanner类

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

使用readLine()函数

“readLine()” 返回类型为String?的值,以处理读取文件末尾等出现的空值情况。下面的代码展示了使用readLine()的示例。

fun main(args: Array<String>) {
    println("请输入您的姓名:")
    var name = readLine()
    print("长度是 ${name?.length}")
}

由于需要使用String类型的函数,我们需要对可空类型进行解包。只有当你绝对确定值不会为空时,才使用!!来强制将String?转换为String。否则,程序将会崩溃。将输入转换为整数,我们可以按照以下步骤进行:

fun main(args: Array<String>) {
var number = readLine()
try {
        println("数字乘以5的结果是 ${number?.toInt()?.times(5)}")
    } catch (ex: NumberFormatException) {
        println("输入的数字无效")
    }
}

再次使用 ?. 运算符将可空类型转换为整数类型,使用 toInt()。然后我们将结果乘以5。持续读取输入 我们可以使用 do while 循环来持续读取输入,如下所示。

    do {
        line = readLine()

        if (line == "quit") {
            println("关闭程序")
            break
        }

        println("回显 $line")

    } while (true)
}
kotlin print 语句循环示例

使用split操作符阅读多个值

我们可以通过分隔符来读取多个数值,并将它们保存在如下所示的元组形式中。

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

fun main(args: Array<String>) {
    println("请输入您的值:")
    try {
        val (a, b, c) = readLine()!!.split(' ')
        println("值分别是 $a $b 和 $c")
    } catch (ex: IndexOutOfBoundsException) {
        println("无效。缺少值")
    }

    try {
        val (x, y, z) = readIntegers()
        println("x 是 $x y 是 $y z 是 $z")
    } catch (ex: IndexOutOfBoundsException) {
        println("无效。缺少值")
    }
    catch (ex: NumberFormatException) {
        println("数字无效")
    }

}
kotlin print 语句分割和异常处理
val ints: List<String>? = readLine()?.split("|".toRegex())
println(ints)

Kotlin的Scanner类

为了接受输入,我们可以使用Scanner(System.`in`),它会从标准输入键盘接收输入。以下代码展示了具体用法:

fun main(args: Array<String>) {
    val reader = Scanner(System.`in`)
    print("请输入一个数字: ")

    // nextInt() 读取下一个整数。next() 读取字符串
    var integer:Int = reader.nextInt()

    println("您输入的是: $integer")

reader.nextInt() 读取下一个整数。reader.next() 读取下一个字符串。reader.nextFloat() 读取下一个浮点数,依此类推。reader.nextLine() 将扫描器传递给下一行并清空缓冲区。以下代码展示了直接在打印语句中读取不同类型的输入。

import java.util.*

fun main(args: Array<String>) {

    val reader = Scanner(System.`in`)
    print("请输入一个数字: ")

    try {
        var integer: Int = reader.nextInt()
        println("您输入的是: $integer")
    } catch (ex: InputMismatchException) {
        println("请输入有效的数字")
    }
    enterValues(reader)
    //将扫描器移动到下一行,否则缓冲输入将仅在此处读取下一个输入。
    reader.nextLine()
    enterValues(reader)
}

fun enterValues(reader: Scanner) {
    println("请输入一个浮点数/布尔值 :")
    try {
        print("值: ${reader.nextFloat()}, ${reader.nextBoolean()}")
    } catch (ex: InputMismatchException) {
        println("第一个值应该是浮点数,第二个应该是布尔值。(用回车键分隔)")
    }
}
kotlin scanner 类示例

Kotlin REPL详解

REPL也称为Read-Eval-Print-Loop(读取-求值-打印-循环),用于直接在交互式Shell中运行代码的一部分。我们可以通过启动Kotlin编译器来在终端/命令行中执行此操作。

安装命令行编译器

我们可以按照这里演示的方法,在Mac/Windows/Ubuntu上安装命令行编译器。通常,在Mac上,我们可以在终端使用HomeBrew来安装Kotlin编译器。

brew update
brew install kotlin
kotlin REPL 示例
bannerAds