Kotlin如何实现ifNullOrEmpty扩展函数及where子句语法疑问
1. ifNullOrEmpty 扩展函数实现
对标Kotlin标准库ifEmpty()的实现逻辑,针对可空CharSequence子类型编写扩展即可,核心是增加null值判断,代码如下:
@SinceKotlin("1.3") @kotlin.internal.InlineOnly public inline fun <C, R> C?.ifNullOrEmpty(defaultValue: () -> R): R where C : CharSequence, C : R = if (this == null || isEmpty()) defaultValue() else this
实现说明:
- 将扩展函数的接收者声明为可空类型
C?,支持接收null值的调用 - 判断逻辑优先校验接收者是否为null,非null场景下再判断是否为空串,命中任意一种情况就执行传入的lambda返回默认值
- 保留和标准库一致的泛型约束、内联修饰符,保证无额外性能开销,类型安全
调用示例:
fun main() { val nullValue: String? = null val emptyValue = "" val validValue = "正常内容" // 输出:null场景命中默认值 println(nullValue.ifNullOrEmpty { "null场景命中默认值" }) // 输出:空串场景命中默认值 println(emptyValue.ifNullOrEmpty { "空串场景命中默认值" }) // 输出:正常内容 println(validValue.ifNullOrEmpty { "不会触发的默认值" }) }
注:该函数为扩展函数,需要在CharSequence子类型(String、StringBuilder等)的可空/非空实例上调用,和标准库ifEmpty()调用形式一致。
2. 语法片段正式名称
你提到的: R where C : CharSequence, C : R包含两部分语法:
- 开头的
: R是Kotlin函数的返回值类型声明,用于指定函数的返回类型为泛型参数R where C : CharSequence, C : R部分的正式名称是泛型多上界约束where子句,用于给泛型类型参数C声明多个必须同时满足的上界约束:C : CharSequence要求传入的接收者类型必须是CharSequence的子类型,保证可以直接调用isEmpty()方法判断空状态C : R要求接收者类型必须是返回值类型R的子类型,保证非空非空串场景下可以直接返回接收者本身,无需额外类型转换
内容的提问来源于stack exchange,提问作者Paul Maltsev
相关产品推荐
相关产品推荐

