我有一个超类(List<SuperClass> classes = ...
)列表,我想根据它们的子类型将它们分成单独的列表。我想用参数化的列表结束这个子类型,即List<A> aClasses = ...
List<SuperClass> aClasses = ...
而不是
鉴于这个类的层次结构:
abstract class SuperClass {...}
class A extends SuperClass {...}
class B extends SuperClass {...}
class C extends SuperClass {...}
这是我到目前为止所得到的,这是有效的。问题是,当迭代aClasses
、bClasses
和cClasses
列表时,我需要在循环中使用强制转换对象。
List<SuperClass> classes = ... // mix of A, B, and C
Map<Class<? extends SuperClass>, List<SuperClass>> grouped = classes.stream()
.collect(Collectors.groupingBy(SuperClass::getClass, Collectors.toList()));
List<SuperClass> aClasses = grouped.get(A.class);
List<SuperClass> bClasses = grouped.get(B.class);
List<SuperClass> cClasses = grouped.get(C.class);
我知道这是可行的,但我正在寻找更简洁的代码(可能使用流)。尽管在编写了下面的代码之后,我想我还能用流做的任何事情都可能和下面的代码一样“复杂”。
List<A> aClasses = new ArrayList<A>();
List<B> bClasses = new ArrayList<B>();
List<C> cClasses = new ArrayList<C>();
for (SuperClass superClass : classes) {
if (superClass instanceof A) {
aClasses.add(superClass);
}
else if (superClass instanceof B) {
bClasses.add(superClass);
}
else if (superClass instanceof C) {
cClasses.add(superClass);
}
}
生成的类将被输入到具有以下签名的方法中:
void processA(List<A> aClasses);
void processB(List<B> bClasses);
void processC(List<C> cClasses);
我不打算这么做:processA((List<A>) (List) aClasses);
发布于 2020-01-23 08:24:47
我不知道有什么比你描述的更好的方式,但我想看看它是否存在。
instanceof
检查可能是最好的方法,我可能会这样做。您描述的Map
路由将需要转换,因为类型未知。
您可以使用流来完成它,但是这需要对列表进行三次迭代。如果列表很小,这可能是可以的,但我仍然会在代码评审中拒绝它。也就是说,如果你需要一种颜色的话,它可能会很有用。
List<Red> reds = colors.stream()
.filter(color -> color instanceof Red)
.map(color -> (Red)color)
.collect(Collectors.toList());
不过,除了一种颜色,我不会再用这个了。一旦添加了第二种颜色,标准的for
循环方法就会更好。
https://stackoverflow.com/questions/59882690
复制相似问题