2015-02-10 53 views
0

我對java 8中的流很新,所以我的方法可能是錯誤的。java 8 stream group by and summming double

我有2個對象如下

object1 { 
    BigDecimal amount; 
    Code1 code1; 
    Code2 code2; 
    Code3 code3; 
    String desc; 
} 

object2 { 
    BigDecimal amount; 
    Code1 code1; 
    Code2 code2; 
    Code3 code3; 
} 

所以我想收集所有object1其中編碼1 & &碼2 & & CODE3是相同的,再總結的金額將它添加到列表Object2的。

我沒有一個代碼來做到這一點...我想寫,沒有工作代碼 我試圖通過部門從http://docs.oracle.com/javase/tutorial/collections/interfaces/map.html

實現的東西和計算所有工資的總和:

// Compute sum of salaries by department 
Map<Department, Integer> totalByDept = employees.stream() 
.collect(Collectors.groupingBy(Employee::getDepartment, 
Collectors.summingInt(Employee::getSalary))); 
+0

BigDecimals的總和如何以object2的列表結束?請向我們展示真實代碼。 – 2015-02-10 14:26:34

+0

根據請求編輯我的問題。 – Ankit 2015-02-10 14:37:53

+0

那麼,什麼是部門類相當於?你需要這樣一個類作爲地圖中的關鍵字,否則,你不能返回地圖。 – 2015-02-10 14:45:48

回答

4

感謝JB Nizet爲我指出了正確的方向。 我不得不修改我的對象2

public class CodeSummary { 
    Double amount; 
    CodeKey key; 
//getters and setters 

} 
public class CodeKey { 
    String code1; 
    String code2; 
    String code3; 
//getters and setters 

@Override 
    public boolean equals(Object o) { 
     if (this == o) return true; 
     if (!(o instanceof CodeKey)) return false; 

     CodeKey that = (CodeKey) o; 

     if (!code1.equals(that.code1)) return false; 
     if (!code2.equals(that.code2)) return false; 
     if (!code3.equals(that.code3)) return false; 

     return true; 
    } 

@Override 
public int hashCode() { 
    int result = code1.hashCode(); 
    result = 31 * result + code2.hashCode(); 
    result = 31 * result + code3.hashCode(); 
    return result; 
} 

} 

疊代object1和填充對象2。一旦我有我的object2(現在codeSymmary)填充。我可以使用下面的方法來完成這項工作。

 Map<CodeKey, Double> summaryMap = summaries.parallelStream(). 
       collect(Collectors.groupingBy(CodeSummary::getKey, 
       Collectors.summingDouble(CodeSummary::getAmount))); // summing the amount of grouped codes. 

如果有人以此爲例。那麼請確保您覆蓋您的密鑰對象中的equal和hashcode函數。否則分組將不起作用。

希望這可以幫助別人