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

时间:2018-05-26 12:35:25

标签: java stream tuples jool-library

我试图用jOOλ库(https://github.com/jOOQ/jOOL)总结Bigdecimal字段

这是我的代码,但它仅适用于汇总双打。 在这里,我将字段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,因为我想用它来总结财务操作。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

问题与jOOλ没有直接关系,而是与JDK的标准Collector的使用有关,它产生双精度,如方法名所示:

Collectors.summarizingDouble(t -> t.x)

j在Collector中附带了自己的一组org.jooq.lambda.Agg构造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)));
});