假设我有一个List<SomeObject> a
现在还假设我有另一个List<SomeProcessor> b
每个SomeProcessor
使用a
进行处理。
此外:
int idx = 0;
for(SomeProcessor o:b){
o2 = a.get(idx);
o.doSomething(o2);
idx++;
}
有更优雅的方式来处理这个问题吗?
答案 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++));
}