Prototype (JavaScript Framework) имеет метод zip()
, который делает именно то, что вам нужно. Это не поможет тебе, хотя, я знаю. Забавно, я ожидал, что у Groovy будет что-то похожее, но я не смог найти ничего ни в Collection
, ни в List
классе.
В любом случае, вот не слишком красивая реализация zip()
:
List.metaClass.zip = { List other, Closure cl ->
List result = [];
Iterator left = delegate.iterator();
Iterator right = other.iterator();
while(left.hasNext()&& right.hasNext()){
result.add(
cl.call(left.next(), right.next())
);
}
result;
}
И вот оно в действии:
def list1 = [1, 1, 1]
def list2 = [1, 1, 1]
print (list1.zip(list2) {it1, it2 -> it1 + it2})
Выход:
[2, 2, 2]
Конечно, вы также можете сделать это менее общим способом, если хотите точно решить свою проблему (и не реализовать универсальную функцию zip / map):
List.metaClass.addValues = { List other ->
List result = [];
Iterator left = delegate.iterator();
Iterator right = other.iterator();
while(left.hasNext()&& right.hasNext()){
result.add(
left.next() + right.next()
);
}
result;
}
def list1 = [1, 1, 1]
def list2 = [1, 1, 1]
print (list1.addValues(list2))
// Output again: [2, 2, 2]