过滤嵌套对象java 8

时间:2017-06-16 20:37:47

标签: java java-8 java-stream

我有这些课程

class LivingOrganism
{
    List<Domain> listOfDomain;
}

class Domain
{
    List<Species> listOfSpecies;
}

class Species
{
    List<Color> listOfColor;
}

class Color
{
    String color;
}

从上到下,在我达到颜色之前,它不会有任何重复的条目。因此,即使它们在另一个域中,某些物种也可以具有相同的颜色。一个物种可以有不同的颜色。

鉴于父母LivingOrganism,我想过滤具有特定颜色的listOfDomain。

我是在经典的嵌套for循环中完成的,但是有4个嵌套,代码看起来不太漂亮。我试图使用java 8 flatmap和filter来获得更优雅的代码,但我花了好几个小时都没有成功。

I even made a badly drawn graph in MSPaint

假设我希望List<Species>可以是蓝色,List<Domain>可以是Species,可以是蓝色。我该怎么办?

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:3)

试试这个。

List<Domain> result = livingOrganism.listOfDomain.stream()
    .filter(d -> d.listOfSpecies.stream()
        .flatMap(s -> s.listOfColor.stream())
        .anyMatch(c -> c.equals("blue")))
    .collect(Collectors.toList());

答案 1 :(得分:3)

你的Color btw看起来很像enum,可能应该这样做。此外,方法的名称应为listOfDomainslistOfSpecieslistOfColors(注意最后的s)。

 String colorOfIntereset = "red";

 LivingOrganism one = new LivingOrganism...
 List<Domain> domains = one.getListOfDomain()
            .stream()
            .filter(d -> {
                return d.getListOfSpecies()
                        .stream()
                        .flatMap(s -> s.getListOfColor().stream())
                        .anyMatch(c -> c.getColor().equals(colorOfIntereset));
            })
            .collect(Collectors.toList());