我有传入的param 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()
分解:
如果元素为null,则使用.let
安全调用运算符调用?.
将使结果为null
。
因此传递给mapNotNull
的lambda是(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()
或者,因为你问:
我为什么要用!!关键字在associateTo方法中,上面我只用非空值过滤它。
这是因为列表仍然是List<Somedata>
类型 - 这没有说明字段本身的可空性。在执行id
调用时,编译器不知道associateTo
字段仍然不为空。