Kotlin中的?、!!、?:、:: 、== 符号

发布时间:2024年01月12日

1、?和!!

刚学kotlin的时候,发现语法和java差不多,但是有些小符号很有意思。

fun find(name : String) : A ?

??加在变量名后,系统在任何情况不会报它的空指针异常。

!!?加在变量名后,如果对象为null,那么系统一定会报异常。

举例 java写法:

ArrayList<String myList = null;     //  创建一个null的队列
Log.d("TAG", "-->> List Size = " + myList.size());

在执行到log打印队列长度的时候,会报空指针错误

而在ktolin中在调用 myList 的时候在它后面加上一个问号 myList?.size() ,则会在 myList 为null 的时候直接打印出null(注意不是0) ,不会抛出 NullPointerException

上述java写法转为ktolin:

val myList: ArrayList<String? = null     //  创建一个null的队列
Log.d("TAG", "-->> List Size = " + myList!!.size)

这样就证明了 !! 会对对象进行非空判断,并且会像 java 代码一样当对象为空时抛出异常。

2、?:

对象A ?: 对象B 表达式,意思为:当对象 A值为 null 时,那么它就会返回后面的对象 B。

举例:

val studentList: ArrayList<Student>? = null
if(studentList?.size ?: 0 > 0){
    println("list不为空")
}

使用上面的 ?和 ?: 就可以避免程序中出现的 NullPointerException 。

3、::

表示把一个方法当做一个参数,传递到另一个方法中进行使用,也就是引用一个方法。

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)
    }
}

4、===

=就是赋值,

== 表示比较两个值大小,

=== 表示比较对象地址。

fun main(args: Array<String) {
    val a : Int = 1000
    println(a == a) //true
    println(a === a) //true
    val a1 : Int = a
    val a2 : Int = a
    println(a1 == a2) //true
    println(a1 === a2) //true
}
fun main(args: Array<String) {
    val a : Int = 1000
    println(a == a) //true
    println(a === a) //true
    val a1 : Int? = a
    val a2 : Int? = a
    println(a1 == a2) //true
    println(a1 === a2) //false
}

解释:

如果我们使用的是??val a : Int = 999 这种方式,这时的a其实就是个数值,不涉及装箱的问题,也就不是对象。 而如果我们使用的是??val a: Int? = 999 这种方式,这时的a是一个Int型对象,因为它涉及到装箱问题。

文章来源:https://blog.csdn.net/m0_61982496/article/details/135557660
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。