Collections Kotlin将具有nullables的列表转换为不具有nullables的HashMap
我有一个传入参数Collections Kotlin将具有nullables的列表转换为不具有nullables的HashMap,collections,kotlin,nullable,Collections,Kotlin,Nullable,我有一个传入参数列表一些数据类包含id字段。 我的目标是从这个列表生成哈希映射 下一种方法是正确的还是有更好/更安全的方法 list .filter { it.id != null } .associateTo(HashMap(), {it.id!! to it}) 实际上,我不明白,为什么我要使用关键字,当我在上面使用非空值对其进行过滤时 或者,也许有一种很好的方法可以使用?。或?。让关键字?您可以执行以下操作: list.mapNotNull { e -> e.id?
列表
一些数据类包含id
字段。
我的目标是从这个列表
生成哈希映射
下一种方法是正确的还是有更好/更安全的方法
list
.filter { it.id != null }
.associateTo(HashMap(), {it.id!! to it})
实际上,我不明白,为什么我要使用在associateTo
方法中的code>关键字,当我在上面使用非空值对其进行过滤时
或者,也许有一种很好的方法可以使用?。
或?。让关键字?您可以执行以下操作:
list.mapNotNull { e -> e.id?.let { it to e } }.toMap()
细分:
使用调用.let
。
安全调用操作符将在元素为null时生成结果null
因此,传递给mapNotNull
的lambda类型为(Somedata)->Pair
mapNotNull
丢弃空对,而toMap
将生成的列表
转换为Map
如果要避免创建中间列表来保存对,可以从一开始就将列表转换为惰性序列
:
list.asSequence().mapNotNull { e -> e.id?.let { it to e } }.toMap()
或者,既然你问:
我为什么要用!!关键字在associateTo方法中,当我在上面使用非空值对其进行筛选时
这是因为列表仍然是类型list
——这与字段本身的可空性无关。在执行associateTo
调用时,编译器不知道id
字段仍然不是空的。只是吹毛求疵:?。let
不是关键字,它是使用调用扩展函数let
。
安全调用操作符。谢谢,我刚从Kotlin开始,所以现在可能会与这样的东西混淆)是的,非常感谢,但结果映射是map
,我需要HashMap
,如何做到这一点的想法?@GoltsevEugene oops。我编辑了我的答案,它应该可以工作(我现在不能测试它,所以它可能需要稍微修改。)现在似乎可以工作,将检查它,现在需要一些时间来理解所有这些;)谢谢!!