0

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

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 的元素。完美的!

但是如何使用forEachof从另一个集合中添加元素map

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

2 回答 2

2

您可以使用命令式循环,也可以使用以下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()
}
于 2019-06-20T11:21:32.930 回答
0

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

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

然后你可以用例如调用它

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

(或者你可以用 avararg而不是一个集合。)

这可能需要更少的时间和内存。

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

于 2019-06-20T12:00:20.123 回答