2017-04-13 25 views
0

您好,我有兩個循環迭代通過列表和使用開關設置name屬性,但我想重構和使用流來代替,但不知道如何做到這一點:JAVA8兩個用於每個循環到流

這裏的代碼片段

for (ClaimDTO claimDTO: claimDTOs) { 
    for (CategoryDTO categoryDTO : claimDTO.getCategories()) { 
     switch (categoryDTO.getCategoryType()) { 
      case "ALLOWANCE": { 
       categoryDTO.setName("Flight"); 
       break; 
      } 
      case "MILEAGE": { 
       categoryDTO.setyName("Car"); 
       break; 
      } 
      default: 
       categoryDTO.setName("Expenses"); 

     } 
    } 
} 

我應該創建函數來解析名稱,只是在流中使用它,它甚至不值得,也不會保存LOC。

+0

你已經試過自己的東西了嗎?這看起來不像是我想要重寫的流 –

+0

通過將'CategoryDTO'的'name'屬性作爲一個計算屬性,可以避免整個嵌套循環或甚至流。或者通過使'CategroyDTO'成爲一個枚舉。 – andih

回答

1

您可以使用flatMap得到所有類別DTOS在一個單一的數據流:

claimDTOs.stream() 
    .flatMap(claim -> claim.getCategories().stream()) 
    .forEachOrdered(this::setName); 

forEachOrdered然後採取其中的每一個元素執行,並且可以作爲一個參考方法(雙冒號)被引用的消費者。

private void setName(CategoryDTO categoryDTO) { 
    switch (categoryDTO.getCategoryType()) { 
     case "ALLOWANCE": { 
      categoryDTO.setName("Flight"); 
      break; 
     } 
     case "MILEAGE": { 
      categoryDTO.setName("Car"); 
      break; 
     } 
     default: 
      categoryDTO.setName("Expenses"); 

    } 
} 
+0

這裏'forEach'不夠好嗎?是的,你重寫了他的循環流,但你有沒有這樣做,例如,性能,可讀性? –

+1

@RobinTopper:如果你不在乎訂購(這可能是這種情況),是'forEach'就可以。可能取決於誰熟悉你與流,平面圖,方法參考等,如果這是更具可讀性。就我個人而言,我發現使用流代碼通常更簡潔和優雅。 – eee

+0

你爲什麼在flatMap中調用流?它不是已經返回流? – sunofkyuss