通过扩展类迭代Arraylist

时间:2011-12-08 12:39:46

标签: java class iteration

我一直想知道Java中的一个函数,我希望它存在。我想迭代一个Arraylist(比如A类),它包含类B和C的对象,它们都扩展了A.这个想法,我只想迭代(例如)ArrayList中B类的对象。

这怎么可能,比如下面代码中的简短示例,而没有长代码?

主要班级:

     import java.util.*;

public class Test {

    public static void main(String[] args) {
        new Test ();
    }

    Test() {
        ArrayList<A> a = new ArrayList<A> ();
        a.add (new B ());
        a.add (new C ());
        a.add (new C ());
        a.add (new B ());
        a.add (new C ());
        for (A aObject : a) { // this works, I want it shorter
            if (aObject instanceof B) {
                B b = (B) aObject;
                System.out.println (b.hi);
            }
        }
        for (B b : a) // like this?
            System.out.println (b.hi);
    }
}

A:

public class A {

}

B:

public class B extends A {
    String hi = "hi";
}

C:

public class C extends A {

}
编辑:因为有这么多人回答这个问题:我知道使用instanceof。我想要一种更快的方法来遍历数组中的所有对象,其中类是B。

4 个答案:

答案 0 :(得分:2)

您可以使用guava

像这样:

for (B b: Iterables.filter(a, B.class)) {
 System.out.println (b.hi);
}

答案 1 :(得分:2)

您可以为它创建一个可重用的Filter类,类似于FileFilter。 (参见korifey关于使用番石榴的答案。)除此之外,不,没有任何现有的功能。此外,任何现有功能都必须完全按照您的要求进行操作,因为List类型无法知道列表中不同类别的对象的位置。 (它必须迭代它们才能找到它们。)

如果您需要一个高性能的解决方案,您可以考虑为单独的实例存储单独的列表 - 替换当前列表或作为当前列表的补充。你甚至可以将它包装在一个复合类中,该类通过一个通用的API提供两种功能(所有实例和类的实例)。

答案 2 :(得分:0)

我同意JRSofty。

for (A aObject : a) {
    if (aObject instanceof B) { // <-- This is as short I can make it
        B b = (B) aObject;
        System.out.println (b.hi);
    }
}

答案 3 :(得分:0)

您可以编写一个更简单的循环:

for (A aObject : a)
    if (aObject instanceof B)
        System.out.println(((B) aObject).hi);

使用instanceof运算符更好。但是,为了过滤掉不属于B类型的列表实例,您需要集成其他集合库,因为标准集合API不直接支持该操作。也许GuavaLambdaJ支持你想要做的过滤操作,我还没有检查过。