Kotlin объединяет два изменяемых списка с нулевым значением

val mutableList1: MutableList<TeamInvitationData?>?
val mutableList2: MutableList<TeamInvitationData?>?

Метод addAll можно использовать для объединения изменяемого списка с нулевым значением, но здесь он выдает ошибку времени компиляции.

Пример:

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

Ошибка интерфейса типа. Попробуйте явно указать аргумент типа.

Здесь я могу объединить эти два массива, заранее спасибо.


person QuokMoon    schedule 12.01.2018    source источник
comment
В какой строке произошла ошибка? Почему бы вам не показать код, который вы на самом деле написали?   -  person Marko Topolnik    schedule 12.01.2018
comment
у этого есть тот же код, что и у меня, и он распаковывается из другого элемента.   -  person QuokMoon    schedule 12.01.2018
comment
Вы не показали код, который пытается использовать addAll. Вы также не показываете ни одной строки кода, которая потребовала бы вывода типа.   -  person Marko Topolnik    schedule 12.01.2018
comment
Вы вставили два фрагмента, которые не объединяются в одно целое. Мое лучшее предположение состоит в том, что вы ожидаете, что map1 и map2 будут MutableList, потому что listOne и listTwo изменяемы, но map на самом деле возвращает неизменяемый List, и поэтому вы не можете вызвать addAll для него. Хотя ваш вопрос касается слияния изменяемых списков, ваш код не пытается этого сделать.   -  person Marko Topolnik    schedule 12.01.2018


Ответы (3)


Вот пара решений.

  1. Если вам нужно добавить все элементы в mutableList1:

    val mutableList1: MutableList<Any?>? = ...
    val mutableList2: MutableList<Any?>? = ...
    
    mutableList1?.let { list1 -> mutableList2?.let(list1::addAll) }
    
  2. В случае, если вам нужен новый список, допускающий значение NULL в результате:

    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()
    
person hluhovskyi    schedule 12.01.2018
comment
Нужно ли использовать внутренний let ? а мне нравится 4-я. - person QuokMoon; 12.01.2018
comment
@QuokMoon, вы можете заменить внутренний let на if (list != null) ... else null, но он будет выглядеть массивным по сравнению с ?.let - person hluhovskyi; 12.01.2018
comment
По сравнению с null Let кажутся идеальными. - person QuokMoon; 12.01.2018
comment
Моя интуиция в Java предала меня в последнем примере, я не понимал, что вы можете объявлять расширения для типов, допускающих значение NULL. - person Marko Topolnik; 12.01.2018

плюс. Возвращает список, содержащий все элементы исходной коллекции, а затем заданный объект Iterable. источник

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

Еще один хороший способ читать здесь

person Ayush Jain    schedule 30.12.2019

Основываясь на ваших фрагментах, которые не составляют единое целое, я сделал некоторые предположения относительно того, чего вы на самом деле хотели достичь:

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(), как показано в последней строке.

person Marko Topolnik    schedule 12.01.2018