对于下面的代码片段:
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/