如何实现Kotlin枚举键的穷尽groupBy,包含全部枚举键?
实现包含所有枚举键的分组Map
Kotlin标准库自带的groupBy不会自动补充枚举中未匹配到的键,但可以通过几种简洁的方式实现你想要的效果:
方法一:基于已有分组补全枚举键
先通过groupBy得到常规分组结果,再利用枚举的values()方法生成包含所有键的Map,对每个键取已有分组的列表或空列表:
enum class E { A, B, C } fun main() { val l = listOf("Alice", "Anne", "Charlie") val grouped = l.groupBy { E.valueOf(it.substring(0,1)) } val result = E.values().associateWith { grouped[it] ?: emptyList() } println(result) // 输出 {A=[Alice, Anne], B=[], C=[Charlie]} }
方法二:先初始化全键Map再填充
先创建一个所有枚举键对应空列表的Map,再遍历原列表将元素添加到对应分组中:
enum class E { A, B, C } fun main() { val l = listOf("Alice", "Anne", "Charlie") val result = E.values().associateWith { mutableListOf<String>() }.apply { l.forEach { element -> val key = E.valueOf(element.substring(0,1)) this[key]?.add(element) } } println(result) // 输出 {A=[Alice, Anne], B=[], C=[Charlie]} }
方法三:封装扩展函数提升复用性
如果需要多次使用这个逻辑,可以封装成扩展函数,让代码更简洁易读:
enum class E { A, B, C } fun <T, K : Enum<K>> Collection<T>.groupByAllEnumValues(keySelector: (T) -> K): Map<K, List<T>> { val enumValues = enumValues<K>() val grouped = this.groupBy(keySelector) return enumValues.associateWith { grouped[it] ?: emptyList() } } fun main() { val l = listOf("Alice", "Anne", "Charlie") val result = l.groupByAllEnumValues { E.valueOf(it.substring(0,1)) } println(result) // 输出 {A=[Alice, Anne], B=[], C=[Charlie]} }
以上几种方式都比暴力遍历更简洁,且充分利用了Kotlin标准库的现有函数,可读性和维护性更强。
内容的提问来源于stack exchange,提问作者k314159
相关产品推荐
相关产品推荐

