Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Collections Kotlin将具有nullables的列表转换为不具有nullables的HashMap_Collections_Kotlin_Nullable - Fatal编程技术网

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。我编辑了我的答案,它应该可以工作(我现在不能测试它,所以它可能需要稍微修改。)现在似乎可以工作,将检查它,现在需要一些时间来理解所有这些;)谢谢!!