В Java 8 я использую их для сексуального зацикливания:
//parallel loop
public static <A, B> void loop(Collection<A> a, Collection<B> b, IntPredicate intPredicate, BiConsumer<A, B> biConsumer) {
Iterator<A> ait = a.iterator();
Iterator<B> bit = b.iterator();
if (ait.hasNext() && bit.hasNext()) {
for (int i = 0; intPredicate.test(i); i++) {
if (!ait.hasNext()) {
ait = a.iterator();
}
if (!bit.hasNext()) {
bit = b.iterator();
}
biConsumer.accept(ait.next(), bit.next());
}
}
}
//nest loop
public static <A, B> void loopNest(Collection<A> a, Collection<B> b, BiConsumer<A, B> biConsumer) {
for (A ai : a) {
for (B bi : b) {
biConsumer.accept(ai, bi);
}
}
}
Некоторые примеры с этими двумя списками:
List<Integer> a = Arrays.asList(1, 2, 3);
List<String> b = Arrays.asList("a", "b", "c", "d");
Петля в минимальном размере a и b :
loop(a, b, i -> i < Math.min(a.size(), b.size()), (x, y) -> {
System.out.println(x + " -> " + y);
});
Выход:
1 -> a
2 -> b
3 -> c
Цикл в пределах максимального размера a и b (элементы в более коротком списке будут циклически):
loop(a, b, i -> i < Math.max(a.size(), b.size()), (x, y) -> {
System.out.println(x + " -> " + y);
});
Выход:
1 -> a
2 -> b
3 -> c
1 -> d
Loop n раз ((элементы будут циклически повторяться, если n больше, чем размеры списков)):
loop(a, b, i -> i < 5, (x, y) -> {
System.out.println(x + " -> " + y);
});
Выход:
1 -> a
2 -> b
3 -> c
1 -> d
2 -> a
Петля навсегда:
loop(a, b, i -> true, (x, y) -> {
System.out.println(x + " -> " + y);
});
Применить к вашей ситуации:
loop(list1, list2, i -> i < Math.min(a.size(), b.size()), (e1, e2) -> {
doStuff(e1);
doStuff(e2);
});