按子类型[关闭]的Java组对象
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按子类型[关闭]的Java组对象相关的知识,希望对你有一定的参考价值。
我有一个超级类(List<Color> colors = ...
)的列表,我想根据它们的子类型将其分成单独的列表。我想结束使用子类型参数化的列表,即List<Red> reds = ...
而不是List<Color> reds = ...
给出该类层次结构:
abstract class Color {...}
class Red extends Color {...}
class Green extends Color {...}
class Blue extends Color {...}
这是我到目前为止所能执行的操作。问题是,当遍历reds
,greens
和blues
列表时,我需要cast the object在循环内。
List<Color> colors = ... // mix of Red, Green, and Blue
Map<Class<? extends Color>, List<Color>> groupedColors = colors.stream()
.collect(Collectors.groupingBy(Color::getClass, Collectors.toList()));
List<Color> reds = groupedColors.get(Red.class);
List<Color> greens = groupedColors.get(Green.class);
List<Color> blues = groupedColors.get(Blue.class);
我知道这可行,但是我正在寻找更多的succinct代码(可能使用流)。尽管在写完下面的代码后,我想我对流所做的任何事情都可能和下面的代码一样“复杂”。
List<Red> reds = new ArrayList<Red>();
List<Green> greens = new ArrayList<Green>();
List<Blue> blues = new ArrayList<Blue>();
for (Color color : colors) {
if (color instanceof Red) {
reds.add(color);
}
else if (color instanceof Green) {
greens.add(color);
}
else if (color instanceof Blue) {
blues.add(color);
}
}
来吧流,可以做到!
答案
我不知道有什么比您描述的更好的方法,但是我想看看它是否存在。
instanceof
检查可能是最好的方法,可能正是我要做的。您描述的Map
路线将需要强制转换,因为类型未知。
您可以使用流来完成此操作,但是这需要遍历列表三遍。如果列表很小,那可能没问题,但是我仍然会在代码审查中拒绝它。就是说,如果您需要one颜色,这可能会很有用。
List<Red> reds = colors.stream()
.filter(color -> color instanceof Red)
.map(color -> (Red)color)
.collect(Collectors.toList());
仍然,我不会只使用一种颜色。添加第二种颜色后,标准的for
循环方法就更好了。
以上是关于按子类型[关闭]的Java组对象的主要内容,如果未能解决你的问题,请参考以下文章