在Java 8,I在性感方式使用这些循环:
//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);
}
}
}
的一些示例,这些2所列出:
List<Integer> a = Arrays.asList(1, 2, 3);
List<String> b = Arrays.asList("a", "b", "c", "d");
环路内的一个分钟大小和b:
loop(a, b, i -> i < Math.min(a.size(), b.size()), (x, y) -> {
System.out.println(x + " -> " + y);
});
输出:
的一个和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
环路Ñ倍((如果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);
});
回复:语义纯度 - 你可以迭代过程中检查列表2边界('(I'list1.length)&&(I'list2.length)'),或者如果您知道迭代期间列表将不会被修改,您可以在循环之前检查是否有'list1'和'list2'具有相同的长度,在这种情况下,您可以避免在迭代期间用明确的良心检查两者的边界。 – QuantumMechanic 2011-04-04 23:47:24
如果一个线程修改'list2'而不是'list1',那么我就搞定了。 – 2011-04-04 23:53:38
就像我说的 - “如果你知道列表在迭代过程中将不会被修改”。而且,那样会让你比现在更糟糕。如果你不得不担心多个线程触及这些列表,那么你就有更多的担忧,而不仅仅是这个循环。 – QuantumMechanic 2011-04-05 00:03:44