Java 8 组依据和 BigDecimal
Java 8 group by and BigDecimal
我有一个Javaclass喜欢
public class A {
private int id;
private BigDecimal amount;
}
我想用 java 8 个这样的对象按 id 分组:
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 来解决?
您可以使用 reducing
与 BigDecimal
进行求和:
.collect(Collectors.groupingBy(A::getId,
Collectors.reducing(BigDecimal.ZERO,
A::getAmount,
BigDecimal::add)))
我有一个Javaclass喜欢
public class A {
private int id;
private BigDecimal amount;
}
我想用 java 8 个这样的对象按 id 分组:
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 来解决?
您可以使用 reducing
与 BigDecimal
进行求和:
.collect(Collectors.groupingBy(A::getId,
Collectors.reducing(BigDecimal.ZERO,
A::getAmount,
BigDecimal::add)))