如何使用 Kotlin 样式向 CopyInWriteCollection 添加元素?

How to add elements to CopyInWriteCollection using Kotlin style?

假设我们有一个自定义集合

class CopyOnWriteCollection<T> {

   // returns copy of collection with new element
   fun add(element: T): CopyOnWriteCollection<T> {
    ...
   }
}

如果我需要添加几个元素,我会这样做:

val newCollection = oldCollection
    .add(1)
    .add(2)
    .add(3)

并且 newCollection 包含来自 oldCollection 的元素,还包含 1,2,3。 完美!

但是我如何使用 mapforEach 添加另一个集合中的元素?

val collection = CopyOnWriteCollection()
(1..3).forEach { collection.add(it) } // this approach works only with mutable collections

您可以使用命令式循环,也可以使用fold()函数:

fun main() {
    var collection = CopyOnWriteCollection<Int>()
    var collection2 = collection

    for (i in 1..3) {
        collection = collection.add(i)
    }

    println(collection)

    collection2 = (1..3).fold(collection2) { coll, i -> coll.add(i) }
    println(collection2)
}

class CopyOnWriteCollection<T> {

    private val list = mutableListOf<T>()

    // returns copy of collection with new element
    fun add(element: T): CopyOnWriteCollection<T> {
        val copy = CopyOnWriteCollection<T>()
        copy.list.addAll(this.list)
        copy.list.add(element)
        return copy;
    }

    override fun toString() = list.toString()
}

如果 CopyOnWriteCollection class 在您的控制之下,我会通过向其添加 addAll() 方法来解决此问题:

    /** Returns copy of collection with new element. */
    fun addAll(elements: Collection<T>): CopyOnWriteCollection<T> {
        // ...
    }

然后您可以调用它,例如

val newCollection = oldCollection.addAll(listOf(1, 2, 3))

(或者您可以使用 vararg 而不是集合。)

这可能会花费更少的时间和内存。

(此外,如果您真的需要编写自己的集合 class,我强烈建议您实现 Collection(或者它的子接口之一,如果合适的话),或者扩展一个 class 确实如此。这将允许访问 stdlib 中的大量扩展方法和其他好东西。)