【问题标题】:Kotlin merge two nullable mutable listKotlin 合并两个可为空的可变列表
【发布时间】:2018-01-12 11:22:37
【问题描述】:
val mutableList1: MutableList<TeamInvitationData?>?
val mutableList2: MutableList<TeamInvitationData?>?

addAll 方法可用于合并可为空的可变列表,但在这里它会引发编译时错误。

例子:

val map1 = listOne?.map { TeamInvitationData(it) }
val map2 = listTwo?.map { TeamInvitationData(it) }
map1.addAll(map2)

类型接口失败,请尝试显式指定类型参数。

这里有什么方法可以合并这两个数组,提前谢谢。

【问题讨论】:

  • 错误发生在哪一行?为什么不显示你实际编写的代码?
  • 这个代码实际上和我一样,并从另一个元素中拆箱。
  • 您没有显示任何尝试使用addAll 的代码。您也没有显示任何需要类型推断的代码行。
  • 您粘贴了两个没有组合成一个整体的 sn-ps。我最好的猜测是,您希望 map1map2MutableList,因为 listOnelistTwo 是可变的,但 map 实际上返回一个不可变的 List,因此您不能调用 @987654331 @ 在上面。虽然您的问题是关于合并可变列表,但您的代码不会尝试这样做。

标签: android kotlin rx-kotlin


【解决方案1】:

这里有几个解决方案。

  1. 如果您需要添加所有元素mutableList1

    val mutableList1: MutableList<Any?>? = ...
    val mutableList2: MutableList<Any?>? = ...
    
    mutableList1?.let { list1 -> mutableList2?.let(list1::addAll) }
    
  2. 如果您需要新的可空列表作为结果:

    val mutableList1: MutableList<Any?>? = ...
    val mutableList2: MutableList<Any?>? = ...
    
    val list3: List<Any?>? = mutableList1?.let { list1 ->
        mutableList2?.let { list2 -> list1 + list2 }
    }
    
  3. 如果您需要新的可空可变列表作为结果:

    val mutableList1: MutableList<Any?>? = ...
    val mutableList2: MutableList<Any?>? = ...
    
    val list3: MutableList<Any?>? = mutableList1
            ?.let { list1 -> mutableList2?.let { list2 -> list1 + list2 } }
            ?.toMutableList()
    
  4. 如果您需要新的非空列表作为结果:

    val mutableList1: MutableList<Any?>? = ...
    val mutableList2: MutableList<Any?>? = ...
    
    val list3: List<Any?> = mutableList1.orEmpty() + mutableList2.orEmpty()
    

【讨论】:

  • 有必要使用内让吗?但我喜欢第四个。
  • @QuokMoon 你可以用if (list != null) ... else null 替换内部的let,但与?.let 相比它看起来会很大
  • 反对 null ,Let 看起来很完美。
  • 我的 Java 直觉在最后一个例子中出卖了我,我没有意识到你可以在可为空的类型上声明扩展。
【解决方案2】:

。返回一个 List,其中包含原始集合的所有元素,然后是给定的 Iterable。 source

Collection<T>.plus(elements: Iterable<T>): List<T>

又一篇好书here

【讨论】:

    【解决方案3】:

    根据你的 sn-ps,它并没有形成一个一致的整体,我对你真正想要实现的目标做了一些猜测:

    val mutableList1: MutableList<String?>? = ...
    val mutableList2: MutableList<String?>? = ...
    
    val mapped1 = mutableList1?.mapTo(ArrayList()) { TeamInvitationData(it) }
    val mapped2 = mutableList2?.mapTo(ArrayList()) { TeamInvitationData(it) }
    
    mapped1?.addAll(mapped2.orEmpty())
    

    需要注意的关键点是map()无论输入列表的类型如何,都会返回一个不可变列表。要获得可变列表,您必须使用mapTo(destination) { ... }。修复后,您可以使用addAll(),如最后一行所示。

    【讨论】:

      【解决方案4】:

      您可以使用 java ArrayList 添加下面的所有项目示例

      val list: MutableList<Student> = ArrayList()
      
      list.addAll(otherListOfStudent)
      

      快乐编码:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-23
        • 2019-06-13
        • 2016-06-27
        • 1970-01-01
        • 2018-08-23
        • 1970-01-01
        • 1970-01-01
        • 2023-01-03
        相关资源
        最近更新 更多