java - 如何按类别过滤列表?

标签 java gwt collections guava

我有一个父类(super class)型列表,想过滤属于特定实现类的所有对象。

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

List<Base> list;

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

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

如何替换它以与 GWT 兼容?

最佳答案

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);
        }
    }

关于java - 如何按类别过滤列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15760022/

相关文章:

java - OSX 上的 DBeaver - 返回空连接

java - 类中的构造函数可以有超过 1 个 super() 吗? (Java 或 GWT)

java - 使用构建器定义不可变映射的类型

java - Guava map 中的 map

java - 为什么 StreamingKMeans 聚类中心与常规 Kmeans 不同

java - 如何在服务器中动态指定jsp文件上传存储文件夹路径

java - GWT 2.5.1 的 Google Guava 15.0 错误?

java - GWT maven 项目的客户端断点可以在 Eclipse 中工作,但不能在 Netbeans 中工作

hibernate - 将同一实体作为集合映射到自身

java - 为什么我的代码绕过了 else if 语句?