【问题标题】:Which function to use for making a copy of a list in kotlin使用哪个函数在 kotlin 中制作列表的副本
【发布时间】:2018-08-10 00:42:17
【问题描述】:

有一个数据列表

val list: List<Data>

并且想要将它的浅拷贝复制到一个新列表中。

在 kotlin 中有几种方法可以做到这一点,想知道在哪种情况下应该使用哪一种?

list?.filtermutableListOf 相似,但listOf 似乎不同。

有人建议吗?

val copyData = list?.filter{true}

copyData = mutableListOf(list)

copyData = listOf(list)

【问题讨论】:

    标签: list filter kotlin


    【解决方案1】:

    后两个选项mutableListOf(list)listOf(list) 实际上并不复制列表,它们只是创建一个新列表,其中包含一个指向list 的项目。这不是list 的浅拷贝,因为您无法观察它的旧内容的变化。

    list.filter { true } 选项有效,即您会得到一个新列表,它是 list 的副本,但这不是惯用的解决方案,因为它可能会损害代码的可读性。

    请根据所需的可变性考虑 list.toList()list.toMutableList()

    【讨论】:

    • 谢谢@hotkey! list.toList() 似乎与 toMutibleList() 相同? list.toMutableList() ==> public fun Collection.toMutableList(): MutableList { return ArrayList(this) } ;和 list.toList() ==> inline fun java.util.Enumeration.toList(): List = java.util.Collections.list(this) ;调用 public static ArrayList list(Enumeration e) { ArrayList l = new ArrayList(); while (e.hasMoreElements()) l.add(e.nextElement());返回 l; }
    • 它们是相似的,尽管它们返回的列表作为不同接口的实例公开:Kotlin List&lt;T&gt; 与 Java 不同,是只读列表的接口,MutableList&lt;T&gt; 具有变异功能。请参阅:stackoverflow.com/questions/46445909/…,以及文档:kotlinlang.org/docs/reference/collections.html
    【解决方案2】:

    如果您真的想过滤传入列表并使用过滤后的列表,请使用filter。使用filter{true} 真的没有意义。

    如果您需要调整返回的列表,请使用toMutableList,例如您需要添加其他元素或删除一些元素。

    最后,如果您需要一个包含相同元素的新列表,则使用toList,这不允许添加/删除元素。您可能还想查看有关 Collections: List, Set, Map 的 Kotlin 参考资料

    您提到的那些,即mutableListOflistOf 只是创建包含您传递的任何内容的新列表的便捷方法。所以您实际上构建了一个列表列表。

    【讨论】:

    • 谢谢@Roland!。如果副本不希望受到源更改的影响,filter{true} 可能很有用。即在将列表快照提供给 listView 的适配器时,它可能不希望以后受到原始源列表更改的影响。
    • filter { true } 基本上与调用toList() 相同;-) 我真的向您推荐我添加的关于集合的最后一个链接。大多数方法都返回不可变的集合,除非您调用 mutableListOfmutableMap 等。
    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2013-04-22
    • 2017-07-03
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多