Kotlin-判空辅助工具(标准函数let)

2022-03-10  本文已影响0人  陈饥饿

1、?.操作符:当对象不为空时正常调用相应的方法,当对象为空时则什么都不做。

if(a != null){

    a.doSomething()

}

可以使用?.操作符简化

a?.doSomething()

优化doStudy()函数

fun doStudy(study: Study?){

    study?.readBooks()

    study?.doHomework()

}

2、?:操作符:操作符左右两边都接收一个表达式,如果左边表达式的结果不为空就返回左边表达式的结果,否则就返回右边表达式的结果。

val c = if(a != null){

    a

} else {

    b

}

 使用?:操作符简化

val c = a ?: b

3、编写一个函数用来获得一段文本的长度

fun getTextLength(text: String?): Int{

    if(text != null){

        return text.length

    }

    return 0

}

用?.和?: 简化之后

fun getTextLength(text: String?) = text?.length ?: 0//首先由于text是可能为空的,因此在调用它的length字段时需要使用?.操作符,而当text为空时,text?.length会返回一个null值,这个时候再借助?:操作符让它返回0

4、如果想要强行通过编译,可以使用非空断言工具,写法是在对象的后面加上!!

var content: String? = "hello"

fun main(){

    if(content != null){//从逻辑上已经将空指针异常处理了,但是编译器并不知道,还是编译失败

        printUpperCase()

    }

    fun printUpperCase(){//函数并不知道外部已经对content变量进行了非空检查,在调用toUpperCase()方法时,还认为这里存在空指针风险,从而无法编译通过

        val upperCase = content.toUpperCase()

        println(upperCase)

    }

}

fun printUpperCase(){

    val upperCase = content!!.toUpperCase()//这是一种有风险的写法

    println(upperCase)

}

5、let:let既不是操作符,也不是关键字,而是一个函数,这个函数提供了函数式API的编程接口,并将原始调用对象作为参数传递到Lambda表达式中。

obj.let{ obj2 -> 

    //编写具体的业务逻辑

}//这里调用了obj对象的let函数,然后Lambda表达式中的代码就会立即执行,并且这个obj对象本身还会作为参数传递到Lambda表达式中,为了防止重名,将参数改为了obj2,但是实际上它们是同一个对象

用let简化doStudy()函数:

fun doStudy(study: Study?){

    study?.let { stu -> 

        stu.readBooks()

        stu.doHomework()

    }

}

当Lambda表达式的参数列表中只有一个参数时,可以不用声明参数名,直接使用it关键字来代替即可:

fun doStudy(study: Study?){

    study?.let{

        it.readBooks()

        it.doHomework()

    }

}

6、let函数是可以处理全局变量的判空问题,而if判断语句则无法做到。因为全局变量的值随时有可能被其他线程修改,即使做了判空处理,仍然无法保证if语句的study变量没有空指针风险。

上一篇下一篇

猜你喜欢

热点阅读