android - Kotlin plus() 不改变原始列表

标签 android kotlin pojo

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 */
}

我的输出:

消息已经有[“a”,“bcd”,“xfd”] 现在打印后的结果是:

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

如何使原始消息更新其在FriendClass中的值?

最佳答案

检查函数的签名:

@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 .

关于android - Kotlin plus() 不改变原始列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58446464/

相关文章:

android - 接收由 ImageButton 引起的 Class Cast Exception

java - 自动记录在 catch block 中,仅当注释异常变量时,对于 Java 或 Kotlin

java - 如何使用 Gson 在我的 POJO 类上使用动态 json 值?

java - 无法反序列化 POJO 类的 HTTP 响应。抛出 START_ARRAY token

java - 如何将查询的结果集转换为可以进一步解析以创建 json 的 pojo 类?

java - Android:自定义ListView不会立即填充

android - Xamarin 表单 | Android - GroundOverlayOptions 中的引用图像

android - 操作栏检测 fragment 中的后退按钮单击

maven - Kotlin-无法在intellij中运行 “hello world”

android - 实时数据库显示数据是否仍未上传