Java 8如何过滤嵌套对象

7
我有这些类。
class LivingOrganism
{
    List<Domain> listOfDomain;
}

class Domain
{
    List<Species> listOfSpecies;
}

class Species
{
    List<Color> listOfColor;
}

class Color
{
    String color;
}

从上到下,直到我到达颜色为止,它不会有任何重复的条目。所以即使一些物种在另一个域中,它们也可以拥有相同的颜色。而且单个物种可以有不同的颜色。
给定一个父级LivingOrganism,我想用某种颜色过滤listOfDomain。
我用经典的嵌套for循环做了这件事,但是有4个嵌套for,代码看起来不太好看。我试图使用java 8 flatmap和filter来获得更优雅的代码,但是我花了几个小时没有成功。 我甚至在MSPaint中画了一个糟糕的图表 假设我想要获取可以是蓝色的List或所有可以是蓝色的的列表。我该怎么做?
任何帮助都将不胜感激。

3
我花了几个小时都没有成功。 - Jorn Vernee
从筛选特定颜色的物种开始。使用它,找到按给定物种筛选域的方法。一旦掌握了模式,进一步遍历外部集合将变得容易。 - 9000
1
变量名不应该反映实现方式(listOf...)。当你意识到,比如说,在给定的“域”中,一个“物种”不应该出现超过一次时,你可能会想将集合实现为 Set<Species> 而不是 List,这时变量名就不再与实现相匹配了。这是不好的。变量的命名应该基于其领域目的,而不是其实现方式。(当你决定一个给定的“物种”只存在于一个“域”中时,你可能会做出更激进的改变)。 - Lew Bloch
2个回答

6

试试这个。

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

这段代码对我来说很完美,但是你能解释一下为什么我们不需要深拷贝吗? 想象一下,在同一个 livingOrganism 对象上使用不同颜色的代码片段作为方法运行,那么这是否也会修改原始的 livingOrganism - Wumba

3

你的 Color 看起来很像一个 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());

“Color”确实是一个枚举类型,但为了简单起见,我使用了一个字符串,通过字符串比较即可完成工作 :) - stackyi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接