按子类型[关闭]的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 {...}

这是我到目前为止所能执行的操作。问题是,当遍历redsgreensblues列表时,我需要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组对象的主要内容,如果未能解决你的问题,请参考以下文章

Grails springsecurity LDAP登录,如何按子组限制用户?

如何按子组收集数据?

Java中对象的引用[关闭]

一个具有两种显示类型的片段[关闭]

在javascript中按子数组属性值对对象数组进行排序

Swift 2.0 - 按子数组重新排列 JSON 对象