Java 8 stream - GroupingBy and summing a BigDecimal field
If Salary is Integer or Long or Double, Collectors class provides direct method for summing. Eg: summarizingInt, summarizingLong, summarizingDouble. Always prefer to use methods from JDK instead of writing your own code.
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class C1 {
public static void main(String[] arg){
Map<String, BigDecimal> result = data().stream()
.collect(Collectors.groupingBy(Emp::getDept,
Collectors.mapping(Emp::getSalary, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
System.out.println(result);
}
static class Emp{
public Emp(String name, String dept, BigDecimal salary) {
super();
this.name = name;
this.dept = dept;
this.salary = salary;
}
private String name;
private String dept;
private BigDecimal salary;
public String getName() {
return name;
}
public String getDept() {
return dept;
}
public BigDecimal getSalary() {
return salary;
}
}
private static List<Emp> data(){
Emp e1 = new Emp("e1", "dept1", BigDecimal.valueOf(1.1));
Emp e2 = new Emp("e2", "dept1", BigDecimal.valueOf(1.1));
Emp e3 = new Emp("e3", "dept2", BigDecimal.valueOf(2.1));
Emp e4 = new Emp("e4", "dept2", BigDecimal.valueOf(1.9));
return Arrays.asList(e1, e2, e3, e4);
}
}
If Salary is Integer or Long or Double, Collectors class provides direct method for summing. Eg: summarizingInt, summarizingLong, summarizingDouble. Always prefer to use methods from JDK instead of writing your own code.