Gol*_*ene 2 collections nullable kotlin
我有传入的参数List<Somedata>.Somedataclass包含id字段.
我的目标是让HashMap<Somedata.id, Somedata>此list.
下一步方法是正确的还是有更好/更安全的方法来做到这一点?
list
.filter { it.id != null }
.associateTo(HashMap(), {it.id!! to it})
Run Code Online (Sandbox Code Playgroud)
实际上,我无法理解,为什么我应该!!在associateTo方法中使用关键字,上面我只用非空值过滤它.
或者也许有一个很好的方法来执行?.或?.let关键字?
你可以做:
list.mapNotNull { e -> e.id?.let { it to e } }.toMap()
Run Code Online (Sandbox Code Playgroud)
分解:
要在通话.let与?.安全调用操作会使结果null如果元素为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()
Run Code Online (Sandbox Code Playgroud)
或者,因为你问:
我为什么要用!! 关键字在associateTo方法中,上面我只用非空值过滤它.
这是因为列表仍然是类型List<Somedata>- 这没有说明字段本身的可空性.在执行调用时,编译器不知道id字段仍然不为空associateTo.
| 归档时间: |
|
| 查看次数: |
382 次 |
| 最近记录: |