Java:迭代2个列表的最佳/优雅方式

时间:2012-02-21 07:31:24

标签: java list arraylist iteration

假设我有一个List<SomeObject> a 现在还假设我有另一个List<SomeProcessor> b 每个SomeProcessor使用a进行处理。

此外:

int idx = 0;   
for(SomeProcessor o:b){  
    o2 = a.get(idx);  
    o.doSomething(o2);  
    idx++;   
}

有更优雅的方式来处理这个问题吗?

3 个答案:

答案 0 :(得分:7)

public interface Processor<T> {
    public void process(T object);
}

然后是辅助方法:

public static <T> void processAll(Collection<T> items, Collection<? extends Processor<T>> processors) {
    Iterator<T> i = items.iterator();
    Iterator<? extends Processor<T>> p = processors.iterator();
    while(i.hasNext() && p.hasNext())
        p.next().process(i.next()); 
}

你可以把那个帮助器方法放在使用它的类上,如果只有一个(并使它成为private),或者把它放在一个由整个程序共享的实用程序类中。

当然还有其他方法来编码processAll;例如,您可以在其中一个集合上使用for循环。但无论如何,将这种低级代码分解为辅助方法将使您的高级代码更清晰,更少“嘈杂”。如果你在程序的多个部分做类似的事情,他们可以分享帮助方法。

答案 1 :(得分:1)

如果您可以生成Map<SomeObject, SomeProcessor>而不是两个列表,那么它会很优雅。这可能不适用,但我会试一试。

答案 2 :(得分:1)

也许您可以尝试这种更简单的方式:

int idx = 0;
while(idx<a.size() && idx<b.size()){   
    b.get(idx).doSomething(a.get(idx++));
}