2017-08-03 35 views
5

Tôi có một lớp Java nhưJava 8 nhóm bằng và BigDecimal

public class A { 
    private int id; 
    private BigDecimal amount; 
} 

Tôi muốn nhóm bởi id với java 8 một số đối tượng như thế này:

public class Main { 

    public static void main(String[] args) { 
     A a1 = new A(1, new BigDecimal("500.36")); 
     A a2 = new A(2, new BigDecimal("439.97")); 
     A a3 = new A(2, new BigDecimal("49.97")); 
     A a4 = new A(2, new BigDecimal("9.97")); 

     List<A> postings = new ArrayList<>(); 
     postings.add(a1); 
     postings.add(a2); 
     postings.add(a3); 
     postings.add(a4); 

     List<A> brol = new ArrayList<>(); 

     System.out.println("-----------------"); 

     postings.stream() 
       .collect(Collectors.groupingBy(A -> A.getId(), Collectors.summingDouble(A->A.getAmount().doubleValue()))) 
       .forEach((id, sum) -> brol.add(new A(id, BigDecimal.valueOf(sum)))); 

     brol.forEach(System.out::println); 
    } 
} 

Và kết quả là:

1 500,36
2 499,91

Đó là chính xác những gì tôi đang tìm kiếm. Nhưng, có hoạt động Collectors.summingDouble và tôi biết rằng Double không phù hợp cho hoạt động tiền tệ. Vì vậy, tôi sẽ có vấn đề với phương pháp này (làm việc trên các hoạt động tiền) hoặc có một cách để làm điều đó với BigDecimal?

EDIT Tìm thấy phương pháp này:

postings.stream() 
     //.collect(Collectors.groupingBy(A -> A.getId(), Collectors.summingDouble(A->A.getAmount().doubleValue()))) 
     .collect(Collectors.groupingBy(A -> A.getId(), Collectors.reducing(BigDecimal.ZERO, A::getAmount, BigDecimal::add))) 
     .forEach((id, sum) -> brol.add(new A(id, sum))); 
+2

Xin đừng đưa câu trả lời trong câu hỏi của bạn. Đăng nó một cách riêng biệt bằng cách nhấn "Đăng câu trả lời của bạn". – talex

Trả lời

8

Bạn có thể sử dụng reducing để thực hiện tổng hợp với BigDecimal:

.collect(Collectors.groupingBy(A::getId,    
           Collectors.reducing(BigDecimal.ZERO, 
                A::getAmount, 
                BigDecimal::add))) 
Các vấn đề liên quan