如何按类过滤List?

时间:2013-04-02 09:01:07

标签: java gwt collections guava

我有一个超类型列表,想要过滤所有特定实现类的对象。

class Base;
class Bar extends Base;
class Foo extends Base;

List<Base> list;

当我使用GWT时,仅部分支持Guava。因此,我不能使用以下内容,否则将在普通的java中使用:

Lists.newArrayList(Iterables.filter(list, Bar.class));

我如何替换它以与GWT兼容?

2 个答案:

答案 0 :(得分:6)

Iterables#filter(Iterable<?> unfiltered, Class<T> type)

Predicates#instanceOf(Class<?> clazz)

GWT不兼容,因为GWT中不支持Class#isInstance(Object obj),因为它会使GWT编译器优化失败,而GWT会试图远离反射。

instanceof关键字可用。所以以下方法可行:

    Iterables.filter(list, new Predicate<Base>() {
        @Override
        public boolean apply(Base input) {
            return input instanceof Bar;
        }
    });

也就是说,写作可能更容易/更清晰(参见Guava wiki caveats):

    List<Bar> bars = Lists.newArrayList();
    for (Base base : list) {
        if (base instanceof Bar) {
            bars.add((Bar) base);
        }
    }

答案 1 :(得分:-2)

当您使用泛型类型BASE ..它将自动按BASE类过滤..但如果您想要根据BASE类的子类特定,如上面的示例中所述..将无法实现..