web-dev-qa-db-ja.com

Kotlinは2つのnull可能な可変リストをマージします

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

addAllメソッドを使用してnull可能な可変リストをマージできますが、ここではコンパイル時エラーが発生します。

例:

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

タイプインターフェイスが失敗しました。タイプ引数を明示的に指定してみてください。

ここで何らかの方法で、この2つの配列をマージできます。

7
QuokMoon

ここにいくつかの解決策があります。

  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. 結果として新しいnull可能な可変リストが必要な場合:

    val mutableList1: MutableList<Any?>? = ...
    val mutableList2: MutableList<Any?>? = ...
    
    val list3: MutableList<Any?>? = mutableList1
            ?.let { list1 -> mutableList2?.let { list2 -> list1 + list2 } }
            ?.toMutableList()
    
  4. 結果として新しいnull以外のリストが必要な場合:

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

全体が一貫していないスニペットに基づいて、実際に達成したかったことについていくつか推測しました。

_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()を使用できます。

1
Marko Topolnik

plus。元のコレクションのすべての要素を含むリストを返し、次に指定されたIterableを返します。 ソース

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

別の良い読み ここ

0
Ayush Jain