多个集合的并行迭代

St.*_*rio 1 java collections foreach

我正在阅读J. Bloch的"Effective Java",现在我正处于关于for-eachvs 的部分for-loop.他提到了三种我们无法使用for-each循环的情况,其中一种情况如下:L

并行迭代 - 如果需要并行遍历多个集合,则需要对迭代器或索引变量进行显式控制,以便所有迭代器或索引变量都可以锁步前进(如上面的有缺陷的卡和骰子示例中无意中所示) .

这个案子对我来说不太清楚,我无法想象一个例子.

突然出现在我脑海中的第一个想法是它只是在多个线程中迭代相同的集合,但它可能不是他的意思.我没有看到任何限制阻止我们这样做(只读).其实:

public class MyRunnable implements Runnable{

    private Collection<String> col;

    //CTOR ommmited

    public void run(){
    for(String s : col){
       //print o, not modify
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我们用相同的实例启动一些线程.因此,我们不害怕获取ConcurrentModificationException(JavaDocs)因为我们执行只读访问,即使是同时多个线程也是如此.

怎么了?

Era*_*ran 6

我不认为他同时意味着"并行".

它简单得多.假设您有两个集合,并且您希望相同的循环(不是嵌套循环)迭代它们,并i在每次迭代中获取每个集合的第th个元素.你不能用增强的for循环来做到这一点,因为它隐藏了索引和迭代器.

您必须使用标准for循环(对于有序集合):

private List<String> one;
private List<String> two;

public void run(){
    for(int i = 0; i<one.size() && i<two.size();i++){
       // do something with one.get(i) and two.get(i)
    }
}
Run Code Online (Sandbox Code Playgroud)

或显式迭代器(对于无序的集合):

private Set<String> one;
private Set<String> two;

public void run(){
    for(Iterator<String> iterOne=one.iterator(),Iterator<String> iterTwo=two.iterator(); iterOne.hasNext()&&iterTwo.hasNext();){
       // do something with iterOne.next() and iterTwo.next()
    }
}
Run Code Online (Sandbox Code Playgroud)