2

假设有两个类的两个列表,Class A分别Class BlistOfClassesA和 和listOfClassesB

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

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

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

4

2 回答 2

4

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

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


*如果这两个类是相关的,那么采用它们共同的超类的方法也可以工作。

于 2013-06-12T10:39:41.503 回答
2

您可以实现一个新的类(可以是匿名的)实现Iterable接口,该接口将返回您负责迭代的迭代器listOfClassesAor listOfClassesB。但是,在您的迭代器的定义中,您只能使用类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 
        }
    }
}
于 2013-06-12T10:44:47.867 回答