1. 概述

在 Kotlin 中,根据字符串是否可空以及业务逻辑的不同需求,有多个扩展函数可以帮助我们判断一个 String 是否为空或空白。

本文将系统梳理这些常用方法,帮助你在实际开发中避免踩坑,写出更简洁、安全的代码。

2. 判断空字符串(Empty String)

当一个字符串的长度为 0 时,它就是空的。

对于非空类型 String,可以使用 isEmpty() 扩展函数来判断:

val empty = ""
assertTrue { empty.isEmpty() }

✅ 推荐:若要判断非空,则优先使用 isNotEmpty() 而不是 !isEmpty(),语义更清晰:

val nonEmpty = "42"
assertTrue { nonEmpty.isNotEmpty() }

⚠️ 注意:这两个函数不仅适用于 String,还适用于所有实现 CharSequence 的类型,比如 StringBuilderStringBuffer 等:

val sb = StringBuilder()
assertTrue { sb.isEmpty() }

2.1 处理可空字符串(Nullable String)

如果变量是可空类型 String?,直接调用 isEmpty() 可能会触发 NPE(虽然 Kotlin 类型系统会阻止你犯这种低级错误),正确做法是使用 isNullOrEmpty()

val nullStr: String? = null
val emptyNullable: String? = ""

assertTrue { nullStr.isNullOrEmpty() }
assertTrue { emptyNullable.isNullOrEmpty() }

✅ 这个组合拳非常实用,尤其是在处理 HTTP 请求参数、配置项等可能为 null 或空字符串的场景。

2.2 使用 ifEmpty() 简化条件逻辑

传统写法中,我们常看到这样的判断:

val ipAddress = request.getHeader("X-FORWARDED-FOR")
val source = if (ipAddress.isEmpty()) "default-value" else ipAddress

从 Kotlin 1.3 开始,可以用更函数式的方式简化:

val source = request.getHeader("X-FORWARDED-FOR").ifEmpty { "default-value" }

ifEmpty{} 是一个高阶函数,只有当前字符串为空时才会执行 lambda,返回默认值。
✅ 写法更简洁,逻辑更清晰,推荐在新项目中广泛使用。

3. 判断空白字符串(Blank String)

所谓“空白字符串”,指的是长度为 0 或仅包含空白字符(如空格、制表符 \t、换行符 \n 等)的字符串。

此时就不能只依赖 isEmpty() 了,而应该使用 isBlank()

val blank = "    "
val empty = ""
val notBlank = "  42"

assertTrue { empty.isBlank() }     // true: 空也是“空白”
assertTrue { blank.isBlank() }     // true: 全是空格
assertTrue { notBlank.isNotBlank() } // true: 含有非空白字符

与前面类似,Kotlin 提供了配套函数:

  • isNotBlank():比 !isBlank() 更易读
  • isNullOrBlank():用于可空字符串,同时处理 null 和空白情况

示例:

val nullStr: String? = null
val blankNullable: String? = "   "

assertTrue { nullStr.isNullOrBlank() }
assertTrue { blankNullable.isNullOrBlank() }

✅ 实际开发中,isNullOrBlank() 出现频率极高,尤其在表单校验、参数清洗等场景下几乎是标配。

3.1 使用 ifBlank() 设置默认值

类比 ifEmpty()ifBlank() 在面对“看起来空”的字符串时更加 robust:

val input: String? = "   "
val cleaned = input.ifBlank { "N/A" } // 结果为 "N/A"

❌ 错误示范:只用 ifEmpty() 会导致 " " 被当作有效值保留,埋下隐患。

📌 小贴士:用户输入、前端传参、日志解析等场景,优先使用 isNullOrBlank()ifBlank(),避免被“看不见的空格”坑到。

4. 总结

方法名 适用类型 功能说明
isEmpty() 非空 String 长度为 0
isNotEmpty() 非空 String 非空
isNullOrEmpty() String? null 或长度为 0
isBlank() 非空 String 空或全为空白字符
isNotBlank() 非空 String 包含至少一个非空白字符
isNullOrBlank() String? null、空或全为空白字符
ifEmpty{} String 为空时提供替代值
ifBlank{} String 为空白时提供替代值

✅ 建议:

  • 处理用户输入、外部接口数据时,统一用 isNullOrBlank() 做判空
  • 替代三元表达式时,优先使用 ifBlank{} 而非 if-else
  • 不要混淆 isEmptyisBlank,否则容易引发线上 bug

所有示例代码均可在 GitHub 获取:https://github.com/Baeldung/kotlin-tutorials/tree/master/core-kotlin-modules/core-kotlin-3


原始标题:Checking if a String is Empty in Kotlin