You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:48:13