2017-06-16 219 views
4

我有这些类过滤器嵌套对象的Java 8

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和过滤器来获得更优雅的代码,但是我花了数小时没有成功。

I even made a badly drawn graph in MSPaint

比方说,我想List<Species>,可以是蓝色或List<Domain>与所有的Species可以是蓝色的。我如何继续?

任何帮助,将不胜感激

+3

_“我花了几个小时没有成功”_请编辑问题,包括你最好的尝试,然后解释你为什么被卡住,人们将能够给出更好的解释。另外,请澄清预期产出应该是什么,列表或列表或其他? –

+0

以某种颜色过滤物种的方式开始。使用它,找到一种按给定物种过滤域的方法。一旦你得到了模式,更多的步骤进入外部收藏将是容易的。 – 9000

+1

变量名真的不应该反映实现('listOf ...')。当你意识到这一点时,比如'Species'不应该在给定的'Domain'中出现一次以上,你可能会想把这个集合实现为'Set '而不是'List',名字不会再一次匹配实现。那很糟。为其域名目的命名变量,而不是它们的实现。 (当你决定一个'Species'只存在于一个'Domain'中时,你可能会做出更激进的改变)。 –

回答

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()); 
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()); 
+0

'Color'确实是一个枚举,但为了简单起见,我使用了一个字符串和一个字符串比较来完成工作:) – y1i