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

Kotlin中从List收集Map时如何跳过Null值?求更便捷实现

嘿,我懂你这种困扰!用associateBy的时候连null值都一起塞进Map里,确实不是我们想要的效果。先纠正个小误解:你那个现有的mapNotNull+toMap方案其实生成的是不可变Map哦,toMap()返回的是只读的Map接口,只有调用toMutableMap()才会生成可变的~

下面给你几个更便捷的实现方式,按需选就行:

1. 先过滤再关联,直观又简单

先把value为null的Pair过滤掉,再用associateBy生成Map。这里用!!完全安全,因为已经过滤过了:

val map = listOf(Pair("a", 1), Pair("b", null), Pair("c", 3), Pair("d", null))
    .filter { it.second != null }
    .associateBy({ it.first }, { it.second!! })

2. 用buildMap构建,无中间列表更高效

buildMap是Kotlin 1.3+提供的API,直接在构建过程中跳过null值,不会生成中间的过滤列表,性能更优:

val map = buildMap<String, Int> {
    listOf(Pair("a", 1), Pair("b", null), Pair("c", 3), Pair("d", null))
        .forEach { (key, value) -> value?.let { put(key, it) } }
}

3. 封装扩展函数,复用更方便

如果你经常需要处理这种场景,不如自己封装一个扩展函数,以后直接调用就行:

fun <K, V> Iterable<Pair<K, V?>>.associateNotNullValues(): Map<K, V> = buildMap {
    this@associateNotNullValues.forEach { (key, value) ->
        value?.let { put(key, it) }
    }
}

// 使用示例
val map = listOf(Pair("a", 1), Pair("b", null), Pair("c", 3), Pair("d", null)).associateNotNullValues()

这些方式都能干净利落地生成不含null值的只读Map,比你原来的写法更简洁直观~

内容的提问来源于stack exchange,提问作者Eldar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:36:08