android - Kotlin plus() 不改变原始列表
问题描述
总长,博士
我有一个 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
?
解决方案
检查函数的签名:
@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
)。
这里有一篇关于这些陷阱的好文章。
推荐阅读
- bash - 在处理管道时与 awk 交互
- javascript - 如何为 jsonschema 生成时间字符串
- asp.net - 如何指定作为 WS-Security 一部分的时间戳需要签名 + 修复客户端未使用 id xxx 签名时间戳的错误?
- typescript - 离子存储模块设置和获取对象而不是字符串
- jquery - 如何在导航中单击菜单项以触发 jquery 单击事件
- java - 如何从字符串转换为公钥?
- angular - 反应形式:数组属性被转换为对象
- python-3.x - Tesseract 开源 OCR 引擎 v3.05.00dev,在 pixReadMemPng 中带有 Leptonica 警告
- react-native - React-Native - 使用 TabNavigation 的 fastlane 截图
- icons - PrimeNG 6.0.0-rc1 TreeTable 无法扩展行