java - 按元素类型拆分列表

标签 java list guava

对于下面的代码片段:

List<ParentClass> ls = new ArrayList<ParentClass>();
ls.add(new ChildClass1());
ls.add(new ChildClass2());
ls.add(new ChildClass1());
ls.add(new ChildClass2());
ls.add(new ChildClass2());
ls.add(new ChildClass1());
ls.add(new ChildClass2());

List<ChildClass1> sub1 = new ArrayList<ChildClass1>();
List<ChildClass2> sub2 = new ArrayList<ChildClass2>();
for (ParentClass p : ls) {
    if(p instanceof ChildClass1){
        sub1.add((ChildClass1)p);
    } else {
        sub2.add((ChildClass2)p);
    }
}       

System.out.println(sub1);
System.out.println(sub2);

是否有一种优雅的方法来获取 sub1 和 sub2?我试过返回 Collection《ParentClass》的 Guava Collections2.filter(),而我需要 Collection《ChildClass1》,知道吗?

Collection<ParentClass> sub1= Collections2.filter(ls, Predicates.instanceOf(ChildClass1.class))

最佳答案

使用 Guava 和单 channel ,您可以执行索引操作:

ImmutableListMultimap<Class<?>, ? extends ParentClass> index = FluentIterable.from(ls)
        .index(Object::getClass);
List<ChildClass1> sub1 = (List<ChildClass1>) index.get(ChildClass1.class);
List<ChildClass2> sub2 = (List<ChildClass2>) index.get(ChildClass2.class);

在 Java-8 之前用匿名类替换 Object::getClass:

ImmutableListMultimap<Class<?>, ? extends ParentClass> index = FluentIterable.from(ls)
        .index(new Function<ParentClass, Class<?>>() {
            @Override
            public Class<?> apply(ParentClass o) {
                return o.getClass();
            }
        });

等效的 Stream API 如下:

Map<?, List<ParentClass>> map = ls.stream().collect(Collectors.groupingBy(Object::getClass));
List<ChildClass1> sub1 = (List<ChildClass1>) (List<?>)map.get(ChildClass1.class);
List<ChildClass2> sub2 = (List<ChildClass2>) (List<?>)map.get(ChildClass2.class);

不幸的是,未经检查的转换仍然是必要的。

关于java - 按元素类型拆分列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32346771/

相关文章:

java - 在 Selenium 中获取函数 isElementPresent 的空指针异常...

python - 将字典中的值替换为常量中的值

cocoa - 获取按上次使用顺序排列的正在运行的应用程序列表

java - 为什么 Guava 的 MapMaker 在使用弱键时报告我的 map 大小不正确?

一个应用程序中的 java.util.logging.Logger 和 org.apache.log4j.Logger - 第一个会记录为 log4j 吗?

java - 如何以不同颜色打印异常

java - 使用jquery在jsp页面中接受http session 请求参数

java - 如何在构造函数中访问 application.properties 值

java - 从列表中删除范围(尾部)

java - 如何创建一个空的 Guava ImmutableList?