2017-08-03 9 views
5

私が持っている私は、このようなJava 8つのいくつかのオブジェクトにidでグループに希望Javaの8グループとのBigDecimal

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

のようなJavaクラス:

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

、出力は次のとおりです。

1 500.36
2 499.91

これはまさに私が探しているものです。しかし、Collectors.summingDouble操作があり、私はDoubleが通貨操作には適していないことを知っています。 私はこのメソッドに問題がありますか(マネーオペレーションの作業)、またはBigDecimalで行う方法がありますか?

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

は、あなたの質問に答えを入れないでください。 「あなたの答えを投稿する」を押すことで別に投稿してください。 – talex

答えて

8

あなたはBigDecimalで加算を実行するためにreducingを使用することができます:この方法が見つかり

EDIT

.collect(Collectors.groupingBy(A::getId,    
           Collectors.reducing(BigDecimal.ZERO, 
                A::getAmount, 
                BigDecimal::add))) 
関連する問題