代码之家  ›  专栏  ›  技术社区  ›  Goltsev Eugene

Kotlin将具有nullables的列表转换为不具有nullables的HashMap

  •  2
  • Goltsev Eugene  · 技术社区  · 8 年前

    我有传入参数 List<Somedata>
    Somedata 类包含 id 领域

    我的目标 是为了 HashMap<Somedata.id, Somedata> 从这个 list

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

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

    实际上,我不明白,我为什么要使用 !! 中的关键字 associateTo 方法时,我仅使用非null值对其进行过滤。

    或者也许有一种很好的方法 ?. ?.let 关键词?

    1 回复  |  直到 8 年前
        1
  •  8
  •   Salem    8 年前

    您可以执行以下操作:

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

    细分:

    呼叫 .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()
    

    或者,既然你问:

    我为什么要使用!!associateTo方法中的关键字,在上面我只使用非空值对其进行过滤。

    这是因为列表仍然是类型 List<Somedata> -这并没有说明 领域 它本身编译器不知道 id 字段为 当您的 associateTo 调用已执行。