Kotlin中如何用?.操作符简化可空数组的空值判断?
问题
我有一个返回数组的方法,需要检查某个索引对应的元素是否已设置。在Java中我会这样写:
if (obj.method() != null && obj.method()[some_index] != null) { ... }
请问能否用Kotlin的?.操作符简化这段代码?我期望的写法类似以下伪代码:
if (obj.method()?.[some_index]) { ... }
回答
完全可以用Kotlin的空安全操作符简化这段逻辑,你给出的伪代码稍作调整就能实现,以下是几种简洁的实现方式:
方案一:直接判断元素非空
通过?.安全访问数组,再判断元素是否不为null,写法和你的伪代码非常接近:
if (obj.method()?.[some_index] != null) { // 执行你的业务逻辑 }
也可以用数组的get()方法写法,效果完全一致:
if (obj.method()?.get(some_index) != null) { // 执行你的业务逻辑 }
方案二:用let操作符直接处理非空元素
如果需要在条件满足时直接使用该元素,推荐用?.let链式调用,代码更简洁且能直接拿到非空元素:
obj.method()?.[some_index]?.let { nonNullElement -> // 这里的nonNullElement就是索引对应的非空元素,可直接使用 }
额外提示:处理索引越界问题
如果some_index可能超出数组的有效范围,需要补充索引合法性判断,避免抛出数组越界异常:
val array = obj.method() if (array != null && some_index in array.indices && array[some_index] != null) { // 安全执行逻辑 }
或者结合空安全操作符简化成链式调用:
obj.method()?.takeIf { some_index in it.indices }?.[some_index]?.let { // 同时保证数组非空、索引合法、元素非空 }
内容的提问来源于stack exchange,提问作者ItIsJustMe
相关产品推荐
相关产品推荐

