0
点赞
收藏
分享

微信扫一扫

Kotlin基础语法 五、可空变量的null处理

杨小羊_ba17 2022-03-16 阅读 119

kotlin变量分为可空变量和不可空变量。如果我们定义一个可空变量,在使用的时候,需要判断该段该变量是否为空,如果定义一个不可空的量时,则判断将毫无意义,因为这个变量永远不会为空。
koltlin变量空值处理方式:

方式一、使用传统的 if…else… 条件语句判断
示例:
val l = if (b != null) b.length else -1

方式二、使用安全调用操作符 ?. 判断
用法为:可空变量?.属性/方法。如果可空类型变量为null时,返回null
这种用法大量用于链式调用中,能有效避免空引用异常(NullPointException),因为只要链式调用其中的一个为null,则整个表达式都为null
例如,如果一个员工 Bob 可能会(或者不会)分配给一个部门, 并且可能有另外一个员工是该部门的负责人,那么获取 Bob 所在部门负责人(如果有的话)的名字,我们写作:
bob?.department?.head?.name
安全调用也可以出现在赋值的左侧。这样,如果调用链中的任何一个接收者为空都会跳过赋值,而右侧的表达式根本不会求值
示例:
// 如果 person 或者 person.department 其中之一为空,都不会调用该函数:
person?.department?.head = managersPool.getManager()

方式三、let操作符
如果要只对非空值执行某个操作,安全调用操作符可以与 let 一起使用:
let操作符的作用:当时用安全调用操作符?.的时候忽略掉null
let的用法:可空变量?.let{ … }

示例:排除掉数组中的空元素
val listWithNulls: List<String?> = listOf(“Kotlin”, null)
for (item in listWithNulls) {
item?.let { println(it) } // 输出 Kotlin 并忽略 null
}

方式四、 ?: 操作符
当我们有一个可空的引用 b 时,我们可以说“如果 b 非空,我使用它;否则使用某个非空的值”:
val l: Int = if (b != null) b.length else -1
除了完整的 if-表达式,这还可以通过 Elvis 操作符表达,写作 ?::
val l = b?.length ?: -1
如果 ?: 左侧表达式非空,elvis 操作符就返回其左侧表达式,否则返回右侧表达式。 请注意,当且仅当左侧为空时,才会对右侧表达式求值。
请注意,因为 throw 和 return 在 Kotlin 中都是表达式,所以它们也可以用在 elvis 操作符右侧。这可能会非常方便,例如,检测函数参数:
fun foo(node: Node): String? {
val parent = node.getParent() ?: return null
val name = node.getName() ?: throw IllegalArgumentException(“name expected”)
// ……
}

方式五、 !! 操作符

非空断言运算符(!!)将任何值转换为非空类型。
在使用一个可空类型变量时,在该变量后面加上!!操作符,表示该可空变量不会值mull, 如果该变量是null,会显示的抛出NullPointException异常

例:
val str1 : String? = null
println(str1!!.length) // 在未做空判断的情况下直接使用操作符!!的情况下,抛出了空异常

方式六、as?操作符

安全的类型转换
如果对象不是目标类型,那么常规类型转换可能会抛出 ClassCastException异常。 另一个选择是使用安全的类型转换,如果尝试转换不成功则返回 null

示例:
val aInt: Int? = a as? Int

方式七、其他类提供的空安全方法,比如集合操作

如果你有一个可空类型元素的集合,并且想要过滤非空元素,你可以使用 filterNotNull 来实现
val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List = nullableList.filterNotNull()

举报

相关推荐

0 条评论