题目
Kotlin空安全机制与扩展函数综合应用
信息
- 类型:问答
- 难度:⭐⭐
考点
空安全机制,扩展函数,智能类型转换
快速回答
实现一个安全的字符串处理扩展函数,要求:
- 对可空字符串进行安全处理
- 过滤掉数字字符
- 返回非空结果或默认值
核心代码示例:
fun String?.safeFiltered(prefix: String = ""): String {
return prefix + (this?.filter { !it.isDigit() } ?: "N/A")
}
## 解析
题目要求
实现一个扩展函数 safeFiltered(),要求:
- 对可空字符串(
String?)进行操作 - 过滤掉字符串中的数字字符
- 当字符串为null或空时返回默认值"N/A"
- 支持添加可选前缀参数
原理说明
Kotlin空安全机制的核心要素:
- 可空类型:
String?明确标识可能为null - 安全调用操作符(?.):避免NullPointerException
- Elvis操作符(?:):提供null时的默认值
- 智能类型转换:编译器自动推断非空上下文
完整实现方案
// 扩展函数实现
fun String?.safeFiltered(prefix: String = ""): String {
// 安全调用 + 过滤数字 + Elvis操作符
val filtered = this?.filter { !it.isDigit() } ?: "N/A"
// 智能类型转换:此时filtered已确定为非空String
return if (filtered.isEmpty()) "N/A" else prefix + filtered
}
// 使用示例
fun main() {
val str1: String? = "A1B2C3"
val str2: String? = null
val str3: String? = ""
println(str1.safeFiltered("Result: ")) // 输出: Result: ABC
println(str2.safeFiltered()) // 输出: N/A
println(str3.safeFiltered("Prefix-")) // 输出: N/A
}最佳实践
- 参数默认值:使用
prefix: String = ""使参数可选 - 空值防御:所有对可空类型的操作必须使用安全调用或非空断言
- 二次校验:即使经过null检查,仍需处理空字符串情况
- 扩展函数命名:使用
safeXxx前缀明确标识空安全特性
常见错误
| 错误示例 | 问题分析 |
|---|---|
| 未处理null情况,当this为null时抛出NPE |
| 未处理过滤后可能为空字符串的情况 |
| 使用非空断言(!!)可能导致运行时崩溃 |
扩展知识
- 扩展函数原理:编译为静态方法,第一个参数为接收者对象
- 与标准库结合:可结合
orEmpty()转换:this?.filter(...).orEmpty().ifEmpty { "N/A" } - 性能考量:每次调用创建新字符串,处理大文本时考虑使用
StringBuilder - 替代方案:使用
let函数this?.let { it.filter(...) } ?: "N/A"