Bootstrap

Kotlin系列之?、?:、!!、:: 特殊符号

符号一:?

声明一个变量可为空。

var userData : UserData? = null

符号二:?.

        表示这个变量可以为null。该变量如果为null时,不会执行该变量后面的逻辑,也不会抛出空指针异常,俗称空安全。如果不为null,会正常执行该变量后面的内容。

UserData?.name  

符号三:!!

非空断言运算符
        加在变量后面,表示该变量如果为null时,会抛出空指针异常,像java语法一样空指针不安全;如果不为null,才会正常执行该变量后面的内容。

UserData!!.name

符号四:?:

Elvis操作符:
        A ?: B 如果A 的值为空,则会返回B。一般不推荐用!!,建议使用?:来规避崩溃、报错的发生

println(UserData ?: "当UserData为空时执行")

符号五:::

Kotlin 中 双冒号操作符
        表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法。

class ColonMagic {

    fun main(msg: Array<String>) {
        //调用peopleDo方法,并传入参数  “I say !” 和 say方法体
        //此处 ::say 是将say方法作为参数传入peopleDo方法
        //此处只是将say作为参数,而不会调用say方法,也就不会println(message),不会输出日志
        peopleDo("I say !", ::say)
    }

    /**
     * 一个参数
     * message:String类型
     */
    private fun say(message: String) {
        println(message)
    }

    /**
     * 两个参数
     * msg: String类型
     * dosay: (String) -> Unit 一个参数为String不需要返回值的方法体
     */
    private fun peopleDo(msg: String, doSay: (String) -> Unit) {
        //doSay(msg)调用的就是传入的say方法,即say(msg),只不过参数名是doSay本质是say方法
        //此处打印出来 I say !  日志
        doSay(msg)
    }
}

符号六:===

        =就是赋值,
        == 相当于Java中的equls()用于比较对象的结构(内容)是否相等(对象的结构就是属性和方法),
        === 用于比较对象的引用是否指向同一个对象,运行时如果是基本数据类型===等价于==

符号七:…

range表达式 表示多少到多少之间

if(num in 10..100)//表示10..100 表示 10到100

符号八:``

反引号
1、Kotlin中可以用反引号解决关键字冲突问题
2、将一个不合法的字符变为合法字符,这种情况一般可以用在一个Kotlin方法不希望被Java调用时使用,因为Java语言层面上不支持反引号这种语法。

fun `is`(){
    //用is这种关键字去命名函数
}

fun `哈哈哈哈`(){
    //用中文这种不合法字符去命名函数   
}

符号九:$

拼接符号

"货号 ${data.code}"    //将data.code值拼接到货号后 
//相当于java中
"货号" + data.code

符号十:@

1、限定this的类型

class User {
    inner class State{
        fun getUser(): User{
            //返回User
            return this@User
        }
        fun getState(): State{
            //返回State
            return this@State
        }
    }
}

2、跳转到指定标签处,可以直接跳出多层循环。像汇编语言中的Loop

loop@ for (itemA in arraysA) {   //直接跳出双循环
     var i : Int = 0
      for (itemB in arraysB) {
         i++
         if (itemB > 2) {
             break@loop
         }
         println("itemB:$itemB")
     }
}```

;