【问题标题】:Summarize BigDecimal grouping by properties using jOOλ使用 jOOλ 按属性汇总 BigDecimal 分组
【发布时间】:2018-05-26 12:35:24
【问题描述】:

我正在尝试使用 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,因为我想用它来总结财务操作。

任何帮助将不胜感激。

【问题讨论】:

  • 您的代码不应该编译。 map 的类型应该是Map&lt;Tuple2&lt;Integer, Integer&gt;, Tuple1&lt;DoubleSummaryStatistics&gt;&gt;

标签: java stream tuples jool-library


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 2011-11-24
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多