【问题标题】:How to filter a List by class?如何按类过滤列表?
【发布时间】:2013-04-02 09:01:06
【问题描述】:

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

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


    【解决方案1】:
    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 caveats):

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

    【讨论】:

      【解决方案2】:

      当您使用泛型 BASE 时..它会自动为您过滤 BASE 类..但是如果您想要根据上面示例中提到的 BASE 类的子类来指定..这是不可能的..

      【讨论】:

      • 正如我上面提到的,使用 Guava 可以按类实现此过滤结果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多