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
相关产品推荐
相关产品推荐

