1. 概述
在 Kotlin 中,根据字符串是否可空以及业务逻辑的不同需求,有多个扩展函数可以帮助我们判断一个 String
是否为空或空白。
本文将系统梳理这些常用方法,帮助你在实际开发中避免踩坑,写出更简洁、安全的代码。
2. 判断空字符串(Empty String)
当一个字符串的长度为 0 时,它就是空的。
对于非空类型 String
,可以使用 isEmpty()
扩展函数来判断:
val empty = ""
assertTrue { empty.isEmpty() }
✅ 推荐:若要判断非空,则优先使用 isNotEmpty()
而不是 !isEmpty()
,语义更清晰:
val nonEmpty = "42"
assertTrue { nonEmpty.isNotEmpty() }
⚠️ 注意:这两个函数不仅适用于 String
,还适用于所有实现 CharSequence
的类型,比如 StringBuilder
、StringBuffer
等:
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
- 不要混淆
isEmpty
和isBlank
,否则容易引发线上 bug
所有示例代码均可在 GitHub 获取:https://github.com/Baeldung/kotlin-tutorials/tree/master/core-kotlin-modules/core-kotlin-3