如何按类别过滤列表?

问题描述 投票:0回答:2

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

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

List<Base> list;

由于我使用 GWT,所以仅部分支持 Guava。因此我不能使用以下内容,否则它可以在普通 java 中工作:

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

如何替换它以与 GWT 兼容?

java gwt collections guava
2个回答
6
投票
Iterables#filter(Iterable<?> unfiltered, Class<T> type)

Predicates#instanceOf(Class<?> clazz)

与 GWT 不兼容,因为

Class#isInstance(Object obj)
在 GWT 中不受支持,因为它会破坏 GWT 编译器优化,并且 GWT 会尝试远离反射。

不过,

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

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

也就是说,编写起来可能更容易/更清晰(请参阅Guava wiki警告):

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

-2
投票

由于您使用的是通用类型 BASE..它将自动为您按 BASE 类进行过滤..但是如果您想要根据 BASE 类的子类进行特定,正如您在上面的示例中提到的那样..这是不可能的..

© www.soinside.com 2019 - 2024. All rights reserved.