You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:15:08