Groovy:接收器修改相当于collect()?

时间:2016-03-09 13:04:46

标签: arrays groovy collections

我需要遍历一个数组并对每个元素执行一个函数。完成此操作后,我将不再需要原始数组。 Groovy是否可以在不创建新对象的情况下修改原始数组到位

例如,而不是

a = [1, 2, 3]
a = a.collect { elem -> elem * 2 }

我想这样做:

a.collectInPlace { elem -> elem * 2 }

a成为[2, 4, 6]

在Ruby中,例如,数组类有一个#collect方法,它返回修改后的数组,还有#collect!,它修改了数组并返回nil

1 个答案:

答案 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]