安全调用运算符 ?.

Quibbler 2020-11-18 591

安全调用运算符 ?.


        Kotlin一大特色就是编译期发现空指针问题,避免了运行时出现NullPointException异常。在Android移动开发中空指针问题及其容易出现,代码仓中到处都是冗杂的判空操作。使用Kotlin可以用安全调用运算符大大简化Java中的繁琐判空操作。



1、Kotlin中的安全调用 ?.

        先举个例子看看Java中的常见判空,一个方法对传入的参数判空,如果不空则执行后面的操作。如果为空返回null或其它默认值。

    Bitmap extract(Bitmap bitmap){
        if (null != bitmap) {
            return bitmap.extractAlpha(); //这里简化操作
        } else {
            return null;
        } 
    }

        Kotlin的安全调用运算符 ?. ,如果被调用参数不为空,那么表达式正常执行。若果被调用的参数为null,那么不会调用后面的方法,并且整个表达式的值为null。从而避免了空指针,而且代码也极大的简化了。

fun extract(bitmap: Bitmap?): Bitmap? {
    return bitmap?.extractAlpha()
}



2、链式安全调用

        另外还不止如此,Java开发往往是类中嵌套其它类。


2.1、Java中的啰嗦

        再举个复杂点的例子:

    class Bean {
    }
    
    class DataBean {
        Bean bean;
    }
    
    class PackBean {
        DataBean dataBean;
    }

        如果需要通过外部对象逐层范围内部的对象,而且还可能成员为空,就得不停的拆包,判空,最终处理:

    public void resolveData(PackBean packBean) {
        if (null != packBean) {
            if (null != packBean.dataBean) {
                if (null != packBean.dataBean.bean) {
                    //TO-DO
                }
            }
        }
    }


2.2、转成Kotlin的链式安全调用

        换成前面Kotlin中的安全调用运算符,支持链式的安全调用运算:

class Bean

class DataBean(val bean: Bean)

class PackBean(val dataBean: DataBean)

        简化的调用,如果中间某个环节出现null,整个表达式为null。代码极大简化并且不会出现异常。

fun resolveData(data: PackBean?) {
    val rawData: String? = data?.dataBean?.bean?.toString()
}



不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com