您的当前位置:首页正文

【编程语言】Kotlin快速入门 - 编程技巧一

2024-10-31 来源:个人技术集锦

Kotlin编程技巧十分有用,如果这几篇你不认真看的话,后续你看别人写的代码根本看不懂是什么意思,特别是标准函数的章节。

空指针检查

Java中NPE几乎是最Crash的最大原因,而Kotlin内置编译检查来避免NPE,试看下面的这个代码,方法内部的doHomeWork调用安全吗,由于你不知道传递给你的对象是否为null,在调用时就很容易发生NPE。

    public static void doStudy(Study study) {
        study.doHomeWork();
    }

你可能会想到,提前做个if,如果不为空时再执行:

    public static void doStudy(Study study) {
        if (study != null) {
            study.doHomeWork();
        }
    }

而Kotlin则是非常科学的解决了这个问题,在Kotlin中,上面的代码你可能会写成以下这种形式:

fun main() {
    doWork(null)
}

fun doWork(s: Study) {
    s.doHomeWork()
}

但是编译器会在doWork的调用处报错:Null can not be a value of a non-null type Study,这是因为Kotlin默认所有的参数和变量都不能为空,所以你传递一个null编译器会报错,但我们后续肯定会遇到值为null的情况,所以Kotlin也给我们提供了解决办法。

如果你想允许某个参数为空的话,只需要在参数类型后面加个?即可。

但是此时另外一个错误也来了,这是因为你允许了参数为空,但是方法内又调用了这个参数内部的方法,此时Kotlin就不知道这个参数到底是不是为空:

你可能下意识的想到,再调用之前if判断一下不就好了:

fun doWork(s: Study?) {
    if (s != null) {
        s.doHomeWork()
    }
}

这也是办法,但是Kotlin中还有更好的解决办法:使用?.!!.,前者代表如果调用的对象不为空则调用,后者则告诉Kotlin编译器忽略这个空指针检查,我自己来确保它不是空的,假设遇到空的时候抛出NPE就行了。?.!!.转换成代码就是这样的:

fun doWork(s: Study?) {
    s?.doHomeWork()
}
fun doWork(s: Study?) {
    s!!.doHomeWork()
}

我们再来学习一个操作符:?:,它左右两边各接收一个操作符,如果左边的不为空则直接返回左边的,如果为空则返回右边的,例如一段代码,可以通过它来精简:

fun main() {
    var a = 1
    var b = 2
    var c = if (a != null) {
        a
    }else {
        b
    }
}

简化为:

var c =  a ?: b

这个操作符有什么用处呢?假设有一个方法需要获取传递过来的字符串的长度,我们就可以通过此操作符进行精简:

fun getStringLength(str : String?): Int {
    if (str != null) return str.length
    return 0
}
fun getStringLength(str : String?): Int {
    return str?.length ?: 0
}

结合之前学到的函数精简:

fun getStringLength(str : String?) = str?.length ?: 0

结构声明

data class User(val name: String, val age: Int)

fun main() {
    val user = User("Alice", 25)
    val (name, age) = user // 解构 User 类
    println("Name: $name, Age: $age")
}

输出结果:

Name: Alice, Age: 25

类型别名

typealias 可以为复杂类型定义别名,从而简化代码的可读性。

typealias UserName = String

fun greetUser(user: UserName) {
    println("Hello, $user")
}

fun main() {
    greetUser("Alice")
}

输出结果:Hello, Alice

显示全文