题目
优化Kotlin集合处理:空安全与函数式编程综合应用
信息
- 类型:问答
- 难度:⭐⭐
考点
空安全处理,集合操作,扩展函数,lambda表达式
快速回答
实现步骤:
- 使用
filterNotNull()过滤null值 - 通过
filter和isNotBlank排除空白字符串 - 用
map转换大写格式 - 通过
joinToString拼接结果
核心代码:
fun processStrings(list: List) = list
.filterNotNull()
.filter { it.isNotBlank() }
.map { it.uppercase() }
.joinToString(", ")
## 解析
问题场景
实际开发中常需处理含null和空白项的集合数据。本题要求:过滤null/空白项 → 转大写 → 逗号拼接,考察Kotlin空安全机制与集合操作的结合能力。
原理说明
- 空安全:Kotlin通过
?标记可空类型,filterNotNull()是集合专用的安全操作符 - 函数式编程:链式调用避免临时变量,
filter/map等高阶函数接收lambda表达式 - 扩展函数:
isNotBlank()和joinToString()都是Kotlin标准库扩展函数
完整实现与注释
fun processStrings(input: List): String {
return input
// 1. 过滤null(安全处理可空类型)
.filterNotNull()
// 2. 过滤空白字符串(包括""、" "等)
.filter { str -> str.isNotBlank() }
// 3. 转换大写(注意使用不可变操作)
.map { it.uppercase() }
// 4. 拼接字符串(默认分隔符逗号)
.joinToString(", ")
} 最佳实践
- 优先使用标准库函数:
filterNotNull比filter { it != null }更高效 - 避免!!操作符:强制解包会引发NPE,破坏空安全设计
- lambda简化:单参数时可用
it代替命名参数 - 不可变性:
uppercase()返回新字符串而非修改原值
常见错误
| 错误写法 | 问题分析 |
|---|---|
.filter { it != null && it.isNotEmpty() } | 未处理空格(如" "),应使用isNotBlank |
.map { it!!.uppercase() } | !!可能导致NPE,违反空安全原则 |
.joinToString(", ") { it } | 冗余lambda,直接调用即可 |
扩展知识
- 序列(Sequence):大数据集时用
asSequence()延迟计算提升性能 - 自定义扩展函数:可封装通用逻辑如:
fun List<String?>.cleanAndJoin() = this.filterNotNull().filter(String::isNotBlank).joinToString() - 替代方案对比:
- forEach+可变集合:命令式写法,易引入副作用
- flatMap:
input.flatMap { it?.takeIf(String::isNotBlank)?.let { listOf(it) } ?: emptyList() }(过度复杂)