Android Kotlin实用的语法糖,真甜!

作者: Android开发指南 | 来源:发表于2020-08-21 15:48 被阅读0次

    前言

    Kotlin被Google官方认为是Android开发的一级编程语言。今天,我将主要讲解,关于Kotlin的一些实用语法糖,主要包括:

    • 范围使用:in、downTo、step、until
    • 类型检查 & 转换:is、智能转换、as
    • 相等性:equals()、==、===
    • 空安全

    1. 范围使用

    主要用于表示范围,主要包括:in、downTo、step、until

    /**
     *  1\. in
     *  作用:在...范围内
     **/
    // 表示:若i在1-5范围内,则执行下面代码
    // 注:闭区间,[1,5]
    if (i in 1..5) {
        println("i 在 1-5 内")
    }
    
    // 表示:若i不在1-5范围内,则执行下面代码
    // !in表示不在...范围内
    if (i !in 1..5) {
        println("i 不在 1-5 内")
    }
    
    /**
     *  2\. until
     *  作用:表示开区间
     **/
    // 输出1234
    for (i in 1 until 5) {
     println(i)
    }
    
    /**
     *  3\. downTo
     *  作用:倒序判断
     **/
     for (i in 5 downTo 1) {
        println(i)
     }
    
    /**
     *  4\. step
     *  作用:调整步长
     **/
    // 设置步长为2,顺序输出1、3、5
    for (i in 1..5 step 2) println(i) 
    
    // 设置步长为2,倒序输出5、3、1
    for (i in 1 downTo 5 step 2) println(i) 
    复制代码
    

    2. 类型检查 & 转换

    包括:is、智能转换 和 as

    /**
     *  1\. is
     *  作用:判断一个对象与指定的类型是否一致
     **/
    // 判断变量a的数据类型是否是String
    var a: Any = "a"
    if (a is String) {
        println("a是String类型")
    }
    if (a !is Int) {
        println("a不是Int类型")
    }
    
    /**
     *  2\. 智能转换
     *  说明: kotlin不必使用显式类型转换操作,因为编译器会跟踪不可变值的is检查以及显式转换,并在需要时自动插入(安全的)转换
     **/
     var a: Any = "a"
    if (a is String) {
        println("a是String类型")
        println(a.length) // a 自动转换为String类型
        //输出结果为:1
    }
    
    // 反向检查: a自动转换为String类型
    if (a !is String) {
        print(a.length)
    }
    
    // 在 && 和 || 的右侧也可以智能转换:
    // `&&` 右侧的 a 自动转换为String
    if (a is String && a.length > 0)
    // `||` 右侧的 a 自动转换为String
    if (a is String || a.length > 0)
    
    // 在when表达式和while循环里也能智能转换:
    when(a){
        is String -> a.length
        is Int -> a + 1
    }
    
    // 需要注意:当编译器不能保证变量在检查和使用之间不可改变时,智能转换不能用。智能转换能否适用根据以下规则:
    // 1\. val 局部变量——总是可以,局部委托属性除外;
    // 2\. val 属性——如果属性是 private 或 internal,或者该检查在声明属性的同一模块中执行。智能转换不适用于 open 的属性或者具有自定义 getter 的属性;
    // 3\. var 局部变量——如果变量在检查和使用之间没有修改、没有在会修改它的 lambda 中捕获、并且不是局部委托属性;
    // 4\. var 属性——决不可能(因为该变量可以随时被其他代码修改)
    
    /**
     *  3\. 强制类型转换:as
     **/
    var any: Any = "abc"
    var str: String = any as String
    
    // 强制类型转换是不安全的,若类型不兼容则会抛出一个异常
    var int: Int = 123
    var str: String = int as String
    // 抛出ClassCastException
    
    /**
     *  4\. 可空转换操作符:as?
     *  作用:null不能转换为String,因该类型不是可空的,此时使用可空转换操作符as?
     **/
    var str = null
    var str2 = str as String
    // 抛出TypeCastException
    
    // 使用安全转换操作符as?可以在转换失败时返回null,避免了抛出异常。
    var str = null
    var str2 = str as? String
    println(str2) //输出结果为:null
    复制代码
    

    3. 相等性判断

    在Kotlin中,存在结构相等 & 引用相等 两种相等判断。

    /**
     *  1\. 结构相等:equals()或 ==
     *  作用:判断两个结构是否相等
     **/
    var a = "1"
    var b = "1"
    if (a.equals(b)) {
        println("a 和 b 结构相等")
        // 输出结果为:a 和 b 结构相等
    }
    
    var a = 1
    var b = 1
    if (a == b) {
        println("a 和 b 结构相等")
        // 输出结果为:a 和 b 结构相等
    }
    
    /**
     *  2\. 引用相等:===
     *  作用:判断两个引用是否指向同一对象
     */ 
    // 设置一个类如下
    data class User(var name: String, var age: Int)
    
    // 设置值
    var a = User("Czh", 22)
    var b = User("Czh", 22)
    var c = b
    var d = a
    
    // 对比两个对象的结构
    if (c == d) {
        println("a 和 b 结构相等")
    } else {
        println("a 和 b 结构不相等")
    }
    
    // 对比两个对象的的引用
    if (c === d) {
        println("a 和 b 引用相等")
    } else {
        println("a 和 b 引用不相等")
    }
    
    // 输出结果:
    a 和 b 结构相等
    a 和 b 引用不相等
    复制代码
    

    4. 空安全

    • 在Java中,NullPointerException异常十分常见
    • 而Kotlin的优点则是可以尽可能避免执行代码时出现的空指针异常
    /**
     *  1\. 可空类型与非空类型
     *  在Kotlin中,有两种情况最可能导致出现NullPointerException
     **/
    
    // 情况1:显式调用 throw NullPointerException()
    // 情况2:使用!! 操作符
    // 说明:!!操作符将任何值转换为非空类型,若该值为空则抛出异常
    var a = null
    a!!
    // 抛出KotlinNullPointerException
    
    // 情况3:数据类型不能为null
    // 在 Kotlin 中,类型系统区分一个引用可以容纳 null (可空引用) 和 不能容纳(非空引用)
    // 如:String类型变量不能容纳null
    // 若要允许为空,可声明一个变量为可空字符串:在字符串类型后面加一个问号?
    对于String,则是写作:String?
    var b: String? = "b"
    b = null
    
    /**
     *  2\. 安全调用操作符
     *  作用:表示如果若不为null才继续调用
     **/
     b?.length
     // 表示:若b不为null,才调用b.length
    
     // 注:安全调用符还可以链式调用
     a?.b?.c?.d
     // 假设a不为null,才继续往下调用,以此类推
     // 若该链式调用中任何一个属性为null,整个表达式都会返回null。
     // 若只对非空值执行某个操作,可与let一起使用
    a?.b?.let { println(it) }
    复制代码
    

    至此,关于Kotlin的入门语法讲解完毕。


    5. 总结

    • 本文介绍了Kotlin的一些实用语法糖
    • 接下来推出的文章,我将继续讲解Kotlin的相关知识,包括使用、语法特点等,感兴趣的读者可以继续关注.

    相关文章

      网友评论

        本文标题:Android Kotlin实用的语法糖,真甜!

        本文链接:https://www.haomeiwen.com/subject/qxnujktx.html