Kotlin Flow分组扩展函数groupBy的实现优化咨询
Flow 集合分组扩展函数优化方案
Kotlin 标准库已经内置了 Iterable 的分组能力,你完全不需要手动实现遍历、存哈希表的逻辑,直接调用内置方法就可以把代码简化到1行,同时语义更清晰规范。
最简优化版本(返回不可变集合,推荐)
绝大多数场景下下游不需要修改分组后的列表,直接用标准库 groupBy 即可:
inline fun <T, K> Flow<Iterable<T>>.groupIterableBy(crossinline keySelector: (T) -> K): Flow<Map<K, List<T>>> = map { it.groupBy(keySelector) }
适配可变集合返回值的版本
如果你确实需要和原有实现保持一致的返回类型 Map<K, MutableList<T>>,可以用以下写法:
inline fun <T, K> Flow<Iterable<T>>.groupIterableBy(crossinline keySelector: (T) -> K): Flow<Map<K, MutableList<T>>> = map { iterable -> iterable.groupByTo(mutableMapOf(), keySelector) { it } .mapValues { entry -> entry.value.toMutableList() } }
原有实现的可优化点
- 用
map做单纯的遍历操作不符合语义,map是用来做集合转换的,无返回值的遍历应该用forEach - 手动实现哈希表存值的逻辑冗余,还引入了非空断言
!!,有潜在空指针风险 - 标准库内置方法经过了性能优化,比手动实现的稳定性和效率都更高
使用示例
你需要按 Transaction 的 Category 分组时直接调用即可:
val groupedFlow: Flow<Map<Category, List<Transaction>>> = transactionFlow.groupIterableBy { it.category }
内容的提问来源于stack exchange,提问作者DennisVA
相关产品推荐
相关产品推荐

