2016-11-16 109 views
3

在項目我目前的工作,我們有循環這個構造三個嵌套的:3嵌套的for-each循環爲Java流(或更好的並行流)

List<OutputDataType> resultList = new ArrayList<>(); 

for (OrgStructureEntity product : products) { 

     for (String region : regions) { 

       for (SalesType salesType : SalesType.values()) { 

        resultList.addAll(new SalesRequest(getConnection(), 
          product.getProductMainGroup(), product.getSbu(), planYear, currentPeriod, region, salesType, 
          exchangeRates).calculateSalesKpis()); 
       }  
     } 
} 

產品和地區都設置。 resultList是一個帶有「OutputDataType」對象的ArrayList。 方法calculateSalesKpis()也返回「OutputDataType」對象的列表。 所有這些對象都應該添加到resultList中。我想做到這一切與並行流,使其更快,但我沒有得到多少比這再:

products.stream() 
       .map(product -> regions.stream() 
         .map(region -> Arrays.stream(SalesType.values()) 
           .map(salesType -> new SalesRequest(getConnection(), 
             product.getProductMainGroup(), product.getSbu(), planYear, currentPeriod, region, salesType, 
             exchangeRates).calculateSalesKpis()))) 
       . 

我不知道如何把它所有在結果列表現在如何正確關閉流。 我希望你能幫助我:)

+1

使用.collect(收藏家.toList())終端操作來收集列表中的結果 –

+0

你是說最後一個點在哪裏?這不幸的是不起作用... – Bofrostmann

回答

5

爲了避免流工作>,則需要使用flatmap方法進行採集前扁平化的嵌套Stream結構:

products.stream() 
    .flatMap(product -> regions.stream() 
    .flatMap(region -> Arrays.stream(SalesType.values()) 
    .flatMap(salesType -> new SalesRequest(getConnection(), 
     product.getProductMainGroup(), product.getSbu(), planYear, currentPeriod, region, salesType, exchangeRates).calculateSalesKpis().stream()))) 
    .collect(Collectors.toList()) 

      . 
+0

這不起作用。我認爲這是因爲calculateSalesKpis()不會返回一個OutputDataType對象,而是一個OutputDatatype對象的列表... – Bofrostmann

+0

collect(java.util.stream.Collector <?super java.util.List ,A,R>)不能應用 到 (java.util.stream.Collector ,java.util.List >) – Bofrostmann

+1

@Bofrostmann我做了更多的更改,但沒有其他代碼,這只是猜測。立即嘗試 –