我可以根据具体情况迭代每个循环吗?

时间:2013-06-12 10:33:06

标签: java

假设有两个类别的列表分别为Class AClass B listOfClassesAlistOfClassesB

现在我需要在特定条件下在单个循环中迭代这些列表,假设布尔变量test为true而不是迭代列表A否则为B,所以我想要类似下面的内容

Boolean test = true;
For( test ? A a:B b   :   test ? listOfClassesA : listOfClassesB){
     String id = test?a.getId():b.getId();
}

我有这个要求,因为几乎在所有情况下几乎所有代码都是相同的所以我不想重复循环两次,但我没有找到任何方法来做到这一点。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:4)

不,Java不允许你写这样的循环。你可以做的是定义一个通用的方法 * ,并在你的循环体中调用该方法。这样你就需要只重复循环标题,而不是循环体内的代码。

if (test) {
    for (A a : listOfA) loopBody(a);
} else {
    for (B b : listOfB) loopBody(b);
}
...
private static <T> void loopBody(T item) {
    ...
}

<小时/> * 如果两个类是相关的,那么采用它们共同超类的方法也可以。

答案 1 :(得分:2)

您可以实现一个新类(可以是匿名的)来实现Iterable接口,该接口将返回负责迭代listOfClassesAlistOfClassesB的迭代器。 但是,在迭代器的定义中,您只能使用类AB常见超类型。

这就是我的想法:

interface I { }
class A implements I { }
class B implements I { }

class MyIterator implements Iterable<I> {
    private List<I> list;

    public MyIterator(boolean test, List<A> listOfClassesA, List<B> listOfClassesB) {
        super();
        this.list = new ArrayList<I>(test ? listOfClassesA : listOfClassesB);
    }

    @Override
    public Iterator<I> iterator() {
        return list.iterator();
    }   
}

public class Test {
    public static void main(String[] args) throws Exception {
        List<A> listOfClassesA = new ArrayList<A>();
        List<B> listOfClassesB = new ArrayList<B>();

        for(I elm : new MyIterator(true, listOfClassesA, listOfClassesB)) {
            // elm is of I type 
        }
    }
}