2017-08-03 39 views
5

Ben böyle java 8 birkaç nesnelerle id göre gruplandırmak istiyorumJava 8 grup ve BigDecimal

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

gibi bir Java sınıfı:

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

Ve çıktısı:

1 500,36
2 499,91

Tam olarak aradığım şey bu. Ancak, Collectors.summingDouble işlemi var ve Double'un para birimi işlemleri için uygun olmadığını biliyorum. Yani bu yöntemle (para işlemleri üzerinde çalışıyor) problemlerim olacak mı yoksa BigDecimal ile yapmanın bir yolu var mı? Bu yöntemi Bulunan

DÜZENLEME :

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

sorunuzun cevabını koymayınız. "Cevabınızı yayınlayın" a basarak ayrı olarak yayınlayın. – talex

cevap

8

Sen BigDecimal ile toplayarak gerçekleştirmek için reducing kullanabilirsiniz:

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