Prototipo (marco de JavaScript) tiene un method zip()
que hace exactamente lo que necesita. Eso no te ayuda, lo sé. Es curioso, esperaba que Groovy tuviera algo similar, pero no pude encontrar nada en la clase Collection
o List
.
De todos modos, aquí hay una aplicación no muy bonita de 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;
}
Y aquí está en acción:
def list1 = [1, 1, 1]
def list2 = [1, 1, 1]
print (list1.zip(list2) {it1, it2 -> it1 + it2})
Salida:
[2, 2, 2]
Por supuesto, también puede hacerlo de una manera menos genérico si se quiere resolver con exactitud su problema (y no aplicar una función genérica zip/mapa):
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]
Posible repetición de esta pregunta: http://stackoverflow.com/questions/4443557/overloading-operator-for-arrays-in-groovy – Northover