代码之家  ›  专栏  ›  技术社区  ›  Farbod Salamat-Zadeh

之间的差异List.subList子列表在科特林切片

  •  0
  • Farbod Salamat-Zadeh  · 技术社区  · 7 年前

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

    这个 documentation for List.subList

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

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

    鉴于 documentation for 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 功能。

    有人能解释一下这两个函数之间的区别,以及你什么时候可能想用一个来代替另一个?

    0 回复  |  直到 6 年前
        1
  •  23
  •   Kevin Robatel    7 年前

    钥匙在 List<T>.slice 功能是 .toList() 最后。
    toList() 将创建一个新的 列表 所有的元素,就像一个拷贝。

    总结:

    • .slice() 列表 元素的子集
    • .subList() 只是原作的一个视图 这将随之改变。

    您可以在这里看到不同之处: 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]
    }
    
    推荐文章