Kotlin 如何创建具有原始列表的每一秒元素的代理列表?

Kotlin 如何创建具有原始列表的每一秒元素的代理列表?,kotlin,Kotlin,我需要一个包装器列表,它反映原始列表的所有更改,如subList(),但只包含第二个元素 我试过: fun getWrapperList(原始列表:列表):列表= IntRange(0,original_list.size.div(2)).map{original_list[it*2+1]} 但它会创建一个不反映更改的新列表。您应该能够执行以下操作(使用computed属性) 您应该能够执行以下操作(使用computedproperty) 我认为标准库中没有这方面的内容,因为这不是一个常见的需

我需要一个包装器列表,它反映原始列表的所有更改,如
subList()
,但只包含第二个元素

我试过:

fun getWrapperList(原始列表:列表):列表=
IntRange(0,original_list.size.div(2)).map{original_list[it*2+1]}

但它会创建一个不反映更改的新列表。

您应该能够执行以下操作(使用
computed
属性)


您应该能够执行以下操作(使用
computed
property)


我认为标准库中没有这方面的内容,因为这不是一个常见的需求。(我记得只有在我想访问备用元素的时候,我才应该将代码重构为子对象列表…)

但是你可以很容易地创建自己的

最简单的方法可能是通过扩展,例如:


如果性能很重要,您可能应该考虑覆盖更多的
AbstractList
方法,甚至直接实现。但这可能需要大量的工作,在许多情况下,这个简单的版本应该足够了。

我认为标准库中没有任何内容可以满足这一要求,因为这不是常见的要求(我记得只有在我想访问备用元素的时候,我才应该将代码重构为子对象列表…)

但是你可以很容易地创建自己的

最简单的方法可能是通过扩展,例如:


如果性能很重要,您可能应该考虑覆盖更多的
AbstractList
方法,甚至直接实现。但这可能需要大量的工作,而且这个简单的版本在很多情况下应该足够了。

我不认为这不是代理列表,因为如果您调用
someClass.derivedList
并保留对结果的引用,该引用不会反映问题中提到的任何后续更改。我不认为这不是代理列表,因为如果调用
someClass.derivedList
并保留对结果的引用,该引用不会反映问题中提到的任何后续更改。
class SomeClass {
    val originalList = mutableListOf(1, 2, 3, 4, 5, 6)

    val derivedList: List<Int>
        get() = originalList.filterIndexed { index, i -> index % 2 == 0 }
}

fun main()  {
    val someClass = SomeClass()
    println(someClass.originalList)
    println(someClass.derivedList)

    someClass.originalList.add(7)
    println(someClass.derivedList)
}
[1, 2, 3, 4, 5, 6]
[1, 3, 5]
[1, 3, 5, 7]
class AlternateView<T>(val sourceList: List<T>): AbstractList<T>() {
    override val size get() = (sourceList.size + 1) / 2

    override fun get(index: Int) = sourceList[index * 2]
}
val list = mutableListOf(1, 2, 3, 4, 5, 6)
val view = AlternateView(list)
println("list=$list, view=$view") // list=[1, 2, 3, 4, 5, 6], view=[1, 3, 5]

list[0] = 7
list.removeAt(1)
list.add(4, 8)
println("list=$list, view=$view") // list=[7, 3, 4, 5, 8, 6], view=[7, 4, 8]