2015-02-10 60 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函数。否则分组将不起作用。

希望这可以帮助别人