【问题标题】:Kotlin plus() not changing the original ListKotlin plus() 不改变原始列表
【发布时间】:2019-10-18 08:01:49
【问题描述】:

TL、DR

我有一个 Kotlin 代码,其中元素被添加到 arraylist 但列表没有存储新值,尽管函数的返回显示了更改的列表。

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 中的值?

【问题讨论】:

    标签: android kotlin pojo


    【解决方案1】:

    检查函数的签名:

    @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 声明)。

    有一篇很棒的文章介绍了其中一些陷阱here

    【讨论】:

    • 我已经更新了我的答案。因为您将列表 messages 声明为 List,所以您无法真正修改它 - 但您可以将其值重新分配给不同的列表。
    • 我不想重新分配,我想更新原始列表,但我会尝试你的答案并尽快回复
    • 你不能就这样。如果您将messages 声明为ArrayListMutableList,则只需调用DataClass.getInstance().friendDetailList[0].messages?.add("Hello")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2020-08-28
    • 2013-11-01
    • 2020-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多