gpt4 book ai didi

collections - Kotlin 将带有可空值的列表转换为不带可空值的 HashMap

转载 作者:行者123 更新时间:2023-12-02 06:49:19 24 4
gpt4 key购买 nike

我有传入参数 List<Somedata> .
Somedata类包含 id字段。

我的目标是制作HashMap<Somedata.id, Somedata>来自这个list .

下一个方法是正确的还是有更好/更安全的方法?

list
.filter { it.id != null }
.associateTo(HashMap(), {it.id!! to it})

其实我也看不懂,为什么要用!! associateTo 中的关键字方法,在上面我只用非空值过滤它。

或者也许有一种使用 ?. 执行此操作的好方法或 ?.let关键词?

最佳答案

你可以这样做:

list.mapNotNull { e -> e.id?.let { it to e } }.toMap()

分割:

调用.let?.安全调用运算符将​​使结果 null如果元素为空。

所以 lambda 传递给了 mapNotNull类型为 (Somedata) -> Pair<IdType, Somedata> .

mapNotNull丢弃空对,toMap结果 List<Pair<IdType, Somedata>>进入Map<IdType, Somedata> .

如果你想避免创建一个中间列表来保存对,你可以把列表变成一个惰性的 Sequence从头开始:

list.asSequence().mapNotNull { e -> e.id?.let { it to e } }.toMap()

或者,既然你问了:

why should I use !! keyword in associateTo method, when above I filtered it with non-null values only.

这是因为列表仍然是 List<Somedata> 类型- 这没有说明字段 本身的可空性。编译器不知道 id到您的 associateTo 时,字段不为空调用被执行。

关于collections - Kotlin 将带有可空值的列表转换为不带可空值的 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49097130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com