Kotlin plus () не меняет первоначальный список - PullRequest
0 голосов
/ 18 октября 2019

TL, DR

У меня есть код Kotlin, в котором элементы добавляются в массив, но в списке не сохраняется новое значение, хотя возвращаемое значение функции показывает измененный список.

Example problem: 
/* someList = ["A", "ab"] */
val x = someList.plus("Abc")

Example output: 
someList = ["A", "ab"] , x = ["A", "ab", "Abc"]

Полная проблема

Мой код:

class FriendClass{
   /* others */
   @JsonProperty("messages")
   var messages: List<String>? = ArrayList()
}
class DataClass{
   /* singleton */
   /* others */
   @JsonProperty("friend_detail_list")
   var friendDetailList: List<FriendClass> = ArrayList()
}
class Adapter{
    val a = DataClass.getInstance().friendDetailList[0].messages?.plusElement("Hello")
    val b = DataClass.getInstance().friendDetailList[0].messages    
    val c = DataClass.getInstance().friendDetailList[0].messages?.toMutableList().add("Hello")
    val d = DataClass.getInstance().friendDetailList[0].messages 
    /* printing a, b, c, d */
}

Мой вывод:

messages уже имел ["a", "bcd", "xfd"] Теперь после печати результаты выглядят следующим образом:

a = ["a", "bcd", "xfd", "Hello"]
b = ["a", "bcd", "xfd"] 
a = true
b = ["a", "bcd", "xfd"] 

Как сделать, чтобы оригинал messages обновил его значения вFriendClass

1 Ответ

2 голосов
/ 18 октября 2019

Проверьте подпись функции:

@kotlin.internal.InlineOnly
public inline fun <T> Iterable<T>.plusElement(element: T): List<T> {
    return plus(element)
}

/**
 * Returns a list containing all elements of the original collection and then the given [element].
 */
public operator fun <T> Collection<T>.plus(element: T): List<T> {
    val result = ArrayList<T>(size + 1)
    result.addAll(this)
    result.add(element)
    return result
}

Из этого ясно, что она не изменяет исходный список. Вместо этого вы, вероятно, захотите:

val messages = DataClass.getInstance().friendDetailList[0].messages
DataClass.getInstance().friendDetailList[0].messages = messages.plusElement("Hello")

Это будет работать, потому что messages является изменяемым (объявлено с var).

Есть отличная статья о некоторых из этих ошибок здесь .

...