如何使用 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。
完美!
但是我如何使用 map
的 forEach
添加另一个集合中的元素?
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 中的大量扩展方法和其他好东西。)
假设我们有一个自定义集合
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。
完美!
但是我如何使用 map
的 forEach
添加另一个集合中的元素?
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 中的大量扩展方法和其他好东西。)