安全调用运算符 ?.

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

安全调用运算符 ?.

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

2.6k
Kotlin的继承
Kotlin

Kotlin的继承

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

2.1k
 Kotlin基本语法
Kotlin

Kotlin基本语法

Kotlin基本语法了解Kotlin语言的基本语法。1、包kotlin文件以.kt结尾,编译文件还是如此只不过在文件名后面加上Kt后缀。这一点和Java不同,Java源文件.java,编译后为.class文件。1.1、包定义每个kotlin文件的第一行就用关键字package定义该文件所在的包。例:1.2、导包用到其它kotlin文件需要使用关键字import导入,这一点和Java一样。kotli

2.1k