2017-08-03 2 views
5

Ich habe eine Java-Klasse wieJava 8-Gruppe durch und BigDecimal

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

ich zu einer Gruppe von ID mit Java 8 mehrere Objekte wie diese möchte:

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); 
    } 
} 

Und der Ausgang ist:

1 500,36
2 499,91

Was genau ich suche. Aber, es gibt die Collectors.summingDouble Operation und ich weiß, dass Double nicht für Währungsoperationen geeignet ist. Also habe ich Probleme mit dieser Methode (Arbeiten an Geldoperationen) oder gibt es eine Möglichkeit, dies mit BigDecimal zu tun?

EDIT diese Methode gefunden:

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

Bitte nicht setzen Antwort in Frage. Posten Sie es separat mit "Post your answer". – talex

Antwort

8

Sie reducing verwenden können die Summierung mit BigDecimal auszuführen:

.collect(Collectors.groupingBy(A::getId,    
           Collectors.reducing(BigDecimal.ZERO, 
                A::getAmount, 
                BigDecimal::add)))