安全调用运算符 ?.

QuibblerQuibbler 2020-11-18 约 4 分钟 2034 次阅读

安全调用运算符 ?.

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

相关推荐

Parcelize:Parcelable 实现生成器
Kotlin

Parcelize:Parcelable 实现生成器

Parcelize:Parcelable 实现生成器Parcelable是安卓开发中常用的序列化方式,之前分享过一个Parcelable序列化插件,方便开发者快速生成代码,提高开发效率。1、Parcelize插件Kotlin官方也推出一个Parcelable自动生成的Gradle插件:Parcelize。1.1、引入插件在项目的build.gradle中添加:id("kotlin-parceliz

3.2k
Kotlin的继承
Kotlin

Kotlin的继承

Kotlin的继承1、超类:Any类似于Java中的Object类,Kotlin也有一个叫Any的超类,是所有类的父类,所有类都默认继承自该类。超类的定义如下,其中定义了三个函数:2、open注意上面的Any类用open修饰,表示该类可以被继承。Kotlin中的类默认都是final的,无法被继承:如果想让类可以被继承,就需要用在定义类的地方用open关键字标识该类可以被继承。3、构造器继承中涉及到

2.7k
Kotlin循环语句
Kotlin

Kotlin循环语句

Kotlin循环语句每门语言都要学一下循环语句,虽然每种语言都有for、while等循环,但总有些各自的特色。1、for循环for循环遍历集合或者数组,使用 in 关键字遍历任何提供迭代器。语法:例:先定义一个数组或集合array:遍历集合array:通常还需要用到索引index,调用集合的withIndex()方法参与循环遍历。例:使用下面的方式遍历for循环,同时获取元素当前索引index和当

2.5k