使用 jOOλ 按属性汇总 BigDecimal 分组

Summarize BigDecimal grouping by properties using jOOλ

我正在尝试总结 Bigdecimal 字段,使用 jOOλ 库 (https://github.com/jOOQ/jOOL)

这是我的代码,但它仅适用于汇总双打。 这里我对字段 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 相关,该标准产生双打,如方法名称所示:

Collectors.summarizingDouble(t -> t.x)

j 在 org.jooq.lambda.Agg 中附带了自己的一套 Collector 构造 API。在你的情况下,你想使用 Agg.sum(Function).

显然,首先更改您的 class 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)));
});