2017-06-16 370 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