如何在Java中并行迭代多个列表?

dar*_*zul 3 java iterator guava

我想创建一个迭代多个列表的函数.现在我知道这些列表具有完全相同的大小(并且它们也可以具有不同的类型),例如:

List<Integer> list1 = getList1();
List<String> list2 = getList2();
List<Long> list3 = getList3();
list1.size() == list2.size(); // returns true
list2.size() == list3.size(); // returns true
Run Code Online (Sandbox Code Playgroud)

并且我希望能够调用一个函数,该函数在每个列表中的相同切片上占用3个元素,例如:

int calculate(int elemList1, String elemList2, long elemList3) {...}

// iterator over the lists in parallel {
    int ret = calculate(elemList1, elemList2, elemList3);
// }
Run Code Online (Sandbox Code Playgroud)

我想做的相当于我在guava中看到的内容,但是看起来还没有实现:http://code.google.com/p/guava-libraries/issues/detail?id = 677

他们谈论做Iterators.interleave或Iterators.zip,我想做类似但我无法做到的事情,所以有人可以帮我一点吗?谢谢!

我宁愿不必获得一个列表的大小并通过索引迭代它们,因为将来我可以有不同大小的列表,所以我只想使用一种方法来做到这一点.

Rob*_*Rob 9

复合迭代器可能是一个很酷的主意,例如:

Iterator<Array<?>> compoundIterator = createIterator(List1, List2, List3);
Run Code Online (Sandbox Code Playgroud)

然后在实现中,你将为每个列表创建迭代器,然后循环遍历项目并将它们放入一个数组中,然后你对这些东西的消费看起来像:

while (compoundIterator.hasElements()){
    Array[] elements = compountIterator.nextElement();
    calculate(elements[0], elements[1], elements[2]);
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案的优点是你隐藏了一个列表是否用完的所有细节(当然,如果有的话,你必须决定你想做什么,但也可以包含在里面).