with.fish

鱼类观测研究所

「Kotlin 速成笔记」区间、逻辑控制、标准函数、空类型判断、Lambda 式函数

发布于 # Kotlin # 笔记

区间

Kotlin 有一种特殊的区间类型,可以用下面方法表示:

val a = 2..233 //[2,233]
val b = 2 until 233 //[2,233)
val c = 233 downTo 2 //[233,2]

区间可以配合其他函数使用,例如,从 Kotlin 1.3 开始,(2..3).random() 可以生成一个 [2,3] 区间内的整数。

逻辑控制

Kotlin 的 if 语句与 Java 基本没有区别,但它可以有返回值。

val result = if ((2..3).random() > (2..3).random()) 2333 else 233

这种写法类似于 Java 中的 三元运算符,但可以调用方法进行返回,所以 Kotlin 抛弃了三元运算符。

when 语句是 Kotlin 的新增特性,用于替代 Java 的 switch 语句。

val result = when ((2..233).random()) {
    233 -> {
        val a = mutableListOf(0, 23, 233, 2333, 23333, 233333, 2333333)
        var bottom = 6
        var i = 1
        var t = 0
        while (i < 2) {
            for (j in bottom downTo (i + 1)) if (a[j] > a[j - 1]) t = a[j];a[j] = a[j - 1];a[j - 1] = t
            i++
            for (j in i until bottom) if (a[j] < a[j + 1]) t = a[j];a[j] = a[j + 1];a[j + 1] = t
            bottom--
        }
        a[1]
    }
    else -> 233
}

when 语句不再仅限于对几种基本变量的判断,还可以让代码更加精简。

Kotlin 抛弃了 Java 的 for-i 循环,而大大加强了 for-each 循环。

for (i in 2..233 step 2) {
    println(i)
}

除了配合区间使用,for 循环也可以配合迭代器使用。

val list = listOf(233, 233, 233)
for (a in list) {
    println(a)
}

Kotlin 的 while 循环与 Java 无异,不再赘述。

标准函数

Kotlin 内置了很多可以简化代码的标准函数,常用的有 withrunapply

with 函数可以在连续调用同一对象的多个方法时带来便利。

val result = with(StringBuilder()) {
    var a = "233"
    for (i in 0..10) append("$a\n");a = "${a}3"
    toString()
}

run 函数和 with 函数相似,但只接收一个 lambda 参数。

val result = StringBuilder().run {
    var a = "233"
    for (i in 0..10) append("$a\n");a = "${a}3"
    toString()
}

apply 函数也只接收一个 lambda 参数,但将对象本身作为返回值。

val result = StringBuilder().apply {
    var a = "233"
    for (i in 0..10) append("$a\n");a = "${a}3"
}.toString()

标准函数的用法很相似,大多可以根据实际情况相互转化。

空类型判断

Kotlin 是一个空安全的语言,有时我们需要空类型判断。在有必要的时候,我们也需要声明可空类型。

var a: Int? = null
a?.let { println(it) }
println(a!!)
println(a ?: 1)

在声明类型之后加 ? 即为可空类型,此时我们需要使用 ?. 操作对象。如果确定对象不可能为空,则可使用 !! 避免空类型判断。?: 则表示如果左侧对象为空则返回右侧的对象。

let 函数也是一种判断空类型的工具,可以简单地看成当对象不为空就执行 let 中的逻辑。

Lambda 式函数

可以说,lambda 是 Kotlin 的精髓所在,Kotlin 内大量的函数都用到了 lambda。这里的「lambda 式函数」专指对应 Java 中接收单抽象方法接口的函数,此类函数的 Kotlin 实现则称为高阶函数。最常见的例子是 Runnable 接口,这个接口只有一个待实现的方法 run()

在 Java 中,这样的写法可以执行一个子线程:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("233");
    }
}).start();

将这段代码翻译成 Kotlin:

Thread(object :Runnable{
    override fun run() {
        println("233")
    }
}).start()

Runnable 接口中只有一个方法,且 Kotlin 规定当方法的最后一个参数为 lambda 时可以将其写到括号外围,故将其简化:

Thread { println("233") }.start()

就可以推导出一个 lambda 式函数的由来。