安全调用运算符 ?.
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()
}
精彩的人生需要浪漫、无畏和勇气。