我需要遍历一个数组并对每个元素执行一个函数。完成此操作后,我将不再需要原始数组。 Groovy是否可以在不创建新对象的情况下修改原始数组到位?
例如,而不是
a = [1, 2, 3]
a = a.collect { elem -> elem * 2 }
我想这样做:
a.collectInPlace { elem -> elem * 2 }
a
成为[2, 4, 6]
在Ruby中,例如,数组类有一个#collect
方法,它返回修改后的数组,还有#collect!
,它修改了数组并返回nil
。
答案 0 :(得分:1)
不,Groovy没有提供这样的方法。但是,你可以创建自己的。这可能是一个糟糕的主意,但你仍然可以这样做:)以下是一个例子:
/*
* A Groovy category to add collectInPlace()
* to the List interface.
*/
class ListCategory {
/*
* Calls the Closure for each element in the List
* and replaces the element with the output of the
* Closure.
*/
static List collectInPlace(List list, Closure closure) {
(0..<list.size()).each { index ->
list[index] = closure(list[index])
}
return list
}
}
def a = [1, 2, 3]
def b
use(ListCategory) {
b = a.collectInPlace { elem -> elem * 2 }
}
assert a.is(b) // Groovy's Object.is(Object) is the equivalent of Java's == operator.
assert b == [2, 4, 6]