我正在尝试使用 jOOλ 库 ( https://github.com/jOOQ/jOOL ) 总结 Bigdecimal 字段
这是我的代码,但它仅适用于总结 double 。 这里我对字段 x 求和,并按字段 w,z 分组:
class A {
final int w;
final Double x;
final int y;
final int z;
A(int w, Double x, int y, int z) {
this.w = w;
this.x = x;
this.y = y;
this.z = z;
}
}
Map<
Tuple2<Integer, Integer>,
DoubleSummaryStatistics
> map =
Seq.of(
new A(1, 1.01D, 1, 1),
new A(1, 2.09D, 3, 1),
new A(1, 8D, 6, 1),
new A(2, 119D, 7, 2),
new A(1, 3.01D, 4, 1),
new A(1, 4D, 4, 1),
new A(1, 5D, 5, 1))
.groupBy(
t -> tuple(t.z, t.w),
Tuple.collectors(
Collectors.summarizingDouble(t -> t.x)
)
);
map.entrySet().forEach(t-> {
log.info("w={}, z={}, sumX={}", t.getKey().v1, t.getKey().v2,
t.getValue().getSum());
});
有没有办法使用 BigDecimal 而不是 Double,使用该库? 我只需要使用 BigDecimal,因为我想用它来总结财务操作。
如有任何帮助,我们将不胜感激。
最佳答案
该问题与 jOOλ 没有直接关系,而是与您对 JDK 标准 Collector
的使用有关,该标准生成如方法名称所示的 double :
Collectors.summarizingDouble(t -> t.x)
j 在 org.jooq.lambda.Agg
中附带了自己的一组 Collector
构造 API。在您的情况下,您想使用 Agg.sum(Function)
.
显然,首先更改您的类A
:
class A {
final int w;
final BigDecimal x;
final int y;
final int z;
...
}
然后:
Map<
Tuple2<Integer, Integer>,
Optional<BigDecimal>
> map =
Seq.of(
new A(1, new BigDecimal("1.01"), 1, 1),
new A(1, new BigDecimal("2.09"), 3, 1),
new A(1, new BigDecimal("8"), 6, 1),
new A(2, new BigDecimal("119"), 7, 2),
new A(1, new BigDecimal("3.01"), 4, 1),
new A(1, new BigDecimal("4"), 4, 1),
new A(1, new BigDecimal("5"), 5, 1))
.groupBy(
t -> tuple(t.z, t.w),
Agg.sum(t -> t.x)
);
map.entrySet().forEach(t-> {
System.out.println(String.format("w=%s, z=%s, sumX=%s", t.getKey().v1, t.getKey().v2,
t.getValue().orElse(BigDecimal.ZERO)));
});
关于java - 使用 jOOλ 按属性总结 BigDecimal 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50542828/