Kotlin中可空字符串null/空白判断如何得到非空Boolean结果
问题根因
你拿到Boolean?类型的原因,是Kotlin安全调用操作符?.的固有逻辑决定的:只要左侧被调用的对象为null,整条调用链就会直接中断、返回null,不会执行后面的方法。
对应你的代码:result.value?.isNotBlank()的返回结果分两种场景:
value有值时,正常执行isNotBlank()返回明确的Boolean结果value为null时,整个表达式直接返回null
这种情况下编译器自然会把hasValue推导为可空的Boolean?类型,拿不到确定的非空true/false结果。
具体实现方案
- 搭配Elvis操作符
?:给null分支指定默认返回值
在安全调用链后面追加?: false,意思是如果前面的调用链因为对象为null返回了null,就直接用false作为整个表达式的结果。最终表达式会自动推导为非空Boolean类型。
实现代码:val hasValue = result.value?.isNotBlank() ?: false
这种写法语义最直接:字符串值为null的时候,本来就不可能满足“有非空白内容”的判断条件,返回false完全符合业务直觉。 - 显式写if分支做空判断
手动对value做非空校验,明确两个分支的返回值,没有语法糖的隐式规则,逻辑完全透明,刚接触Kotlin空安全的开发者读起来没有门槛:val hasValue = if (result.value != null) { result.value.isNotBlank() } else { false } - 直接用标准库内置的空安全扩展
Kotlin在kotlin.text包下提供了专门给可空字符串用的判断方法isNullOrBlank(),这个方法的入参本身就支持可空字符串,返回值天生就是非空Boolean。它的判断逻辑是:字符串为null、或者全是空白字符时返回true,其他情况返回false。只要对结果做一次取反,就刚好匹配“有非空白有效内容”的判断逻辑:
实现代码:val hasValue = !result.value.isNullOrBlank()
这是实际项目里最常用的写法,不需要手动拼安全调用和空判断,代码最精简。
注意避坑
- 不要图省事直接加非空断言
!!来强制把结果转成非空类型,也就是写成result.value!!.isNotBlank()。这种写法会在value为null的时候直接抛空指针异常,完全违背Kotlin空安全的设计初衷,属于高风险的写法。 - 注意判断逻辑的语义匹配:如果你的业务需求是“只要字符串非null就算有值,哪怕内容是全空格”,那对应的判断就应该简化成
val hasValue = result.value != null,不要错用isNullOrBlank()把全空白的情况也算成无效值。
内容的提问来源于stack exchange,提问作者Lena Bru
相关产品推荐
相关产品推荐

