【问题标题】:Difference between List.subList and slice in KotlinKotlin 中 List.subList 和 slice 的区别
【发布时间】:2019-12-06 00:34:43
【问题描述】:

我最近意识到 Kotlin 中有两个非常相似的函数用于获取 List 的一部分,但我不确定其中的区别:

documentation for List.subList 说:

返回此列表在指定 fromIndex(包括)和 toIndex(不包括)之间的部分的视图。返回的列表由该列表支持,因此返回列表中的非结构性更改会反映在该列表中,反之亦然。

基本列表中的结构更改使视图的行为未定义。

documentation for slice 说:

返回一个列表,其中包含指定索引范围内索引处的元素。

或者

返回包含指定索引处元素的列表。

似乎关键区别在于第一个返回列表的“部分视图”,以及是否反映了非结构性变化?但是我不太确定这意味着什么。

我查看了slice函数的源代码:

public fun <T> List<T>.slice(indices: IntRange): List<T> {
    if (indices.isEmpty()) return listOf()
    return this.subList(indices.start, indices.endInclusive + 1).toList()
}

但它会从subList 函数返回一个列表。

有人能解释一下这两个函数之间的区别吗?什么时候你可能想使用其中一个而不是另一个?

【问题讨论】:

  • 您可以查看示例,其中提到了sublistslice 之间的区别,也可以选择droptake 功能来实现相同的chetangupta.net/bbk7

标签: list kotlin collections slice


【解决方案1】:

List&lt;T&gt;.slice 函数中的关键是末尾的.toList()
toList() 的调用将创建一个包含所有元素的新 List,例如副本。

总结:

  • .slice() 将创建一个包含元素子集的新 List
  • .subList() 只是原始 List 的视图,会随之改变。

您可以在此处查看差异:https://pl.kotl.in/-JU8BDNZN

fun main() {
    val myList = mutableListOf(1, 2, 3, 4)
    val subList = myList.subList(1, 3)
    val sliceList = myList.slice(1..2)
    println(subList) // [2, 3]
    println(sliceList) // [2, 3]

    myList[1] = 5
    println(subList) // [5, 3]
    println(sliceList) // [2, 3]
}

【讨论】:

  • 你应该知道,使用切片时列表内容不会被复制,但也会引用同一个对象。因此,如果您对 myList 中的对象进行更改,这些更改也会影响 sliceList 中的对象,因为它是同一个对象。您可以在此处查看此示例pl.kotl.in/AFbm6dWXf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
相关资源
最近更新 更多