31DaysOfKotlin - Day1—安全调用

学习总结

Kotlin处理空引用的风格/策略是在编译期检查出空引用的地方,如果检测查出来便编译失败并提示,即在编译阶段就避免了空引用的调用。为达完成这个目标,Kotilin提供一系列的语法规范去约束大家,同时帮助编译器更好的去判断是否使用用了空引用的同时,也使代码更简洁(减少出现对判空的代码)。其中最核心的是变量定义的时候需要声名变量是否可空,还是非可空(在变量类型后加?号),非可空就是不可以赋值为null,非可空对于对于在编码过程中可以不用判断是否为空。这样下,一方面代码简洁了,另一方面编译器判空的实现也简单与容易了。变量可空时,Kotlin除了提供一系统的语法糖方便我们安全与优雅编写判空的代码,同时编译器也会结合代码的上下文,帮忙我们尽可以的减少非空的判断操作。如下示例代码就是编译器根据上下文判断引用的安全性

val b: String? = "Kotlin"
if (b != null && b.length > 0) { 
    print("String of length ${b.length}") // 编译器已经根据判断条件,确定b变量安全(非空)
} else {
    print("Empty string")
}

知识要点

区分语句与表达式

语句与表达式的最主要的区别是表达式是有值的,有值意味关可以赋值给变量!在学习Kotiln提供的语法糖时需要时刻关注该语法是个语句还是个表达式,这个非常重要,除了能深刻理解该语法,还能更理解加容易记忆与使用

注意,在 Kotlin 和 Java 中表述什么是表达式以及什么不是表达式时,两者有基本的差别。所有的 Kotlin 函数调用都是表达式,因为他们至少会返回 Unit。调用没有定义任意返回值的 Java 函数时不是表达式。
Kotlin 中变量赋值(a = 1)不是表达式,但是在 Java 中则是,因为这个操作之后会返回被赋予的值(在 Java 中,你可以 a = b = 2 或者 a = 2 * (b = 3)))。
在 Java 中所有的控制结构(if, switch) 都不是表达式,而在 Kotlin 中允许 if, when , try 返回值

定义可空变量

变量名 : 变量类型 //非可空
变量名 : 变量类型? //可空

安全调用

安全调用主要是指对于可空变量的使用,除了传统的判空再使用,kotlin提供了额外的语法糖(?.)操作,需要注意该操作是一个表达式,如果操作的变量为空,表达值示值结果是null,否则是实例的调用返回值

  • ?. 可以链式调用,中途某个变量/属性为空时中止调用,表达式求值为null
  • ?. 可以结合let函数据使用,可以对非空对象执行一系列操作
  • 安全调用也可以出现在赋值的左侧。这样,如果调用链中的任何一个接收者为空都会跳过赋值,而右侧的表达式根本不会求值!!!
    代码示例
val a = "Kotlin"
val b: String? = null
println(b?.length) //这里控制台为输出 null 

// 如果 `person` 或者 `person.department` 其中之一为空,都不会调用该函数:
person?.department?.head = managersPool.getManager()
// 注?这个有点矛盾呀,这时候不会求值,但又还是表达式!!!

可空默认值

Elvis 操作符可以替换 当?.操作变量为空时表达式的默认值(null)

val l: Int = if (b != null) b.length else -1
// elvis的写法
val l = b?.length ?: -1

参考文档

发布了231 篇原创文章 · 获赞 123 · 访问量 67万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章