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)

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

Здесь любым способом можно объединить эти два массива, заранее спасибо.

5 ответов

Решение

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

  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()
    

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

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

Еще одно хорошее чтение здесь

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

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

Вы можете использовать java ArrayList, чтобы добавить все образцы ниже.

      val list: MutableList<Student> = ArrayList()

list.addAll(otherListOfStudent)

Удачного кодирования :)

Ответ, данный @hluhovskyi, хороший, но есть еще одна возможность из его второго варианта, где в результате вам нужен новый список с нулевым значением:

В случае, если вам нужен новый список с нулевым значением в результате:

val mutableList1: MutableList<Any?>? = ... val mutableList2: MutableList<Any?>? "="

val list3: Список<Любой?>? = mutableList1?.let { list1 ->mutableList2?.let { list2 -> list1 + list2 } }

В этом примере, если mutableList1 пуст, у вас будет автоматически пустой список, который будет игнорироваться, если в mutableList2 есть элементы.

Итак, если вам нужна сумма двух списков и вам нужен список с нулевым значением, только если два списка равны нулю, вам нужно будет сделать:

      val mutableList1: MutableList<Any?>? = ...
val mutableList2: MutableList<Any?>? = ...

val list3: List<Any?>? = mutableList1?.let { list1 ->
    mutableList2?.let { list2 -> list1 + list2 } 
    ?: list1
} ?: mutableList2

Итак, теперь у вас будет в результате:

  1. Нулевой список, если оба были нулевыми в начале
  2. Сумма обоих списков, если оба не были нулевыми
  3. Если один из них имеет значение null, а другой имеет элементы, он вернет список с элементами.
Другие вопросы по тегам