Суммируйте BigDecimal группирование по свойствам, используя jOOλ - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь суммировать поле 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, потому что я хочу использовать его для обобщения финансовых операций.

Любая помощьбудет оценена.

1 Ответ

0 голосов
/ 28 мая 2018

Проблема связана не с jOOλ напрямую, а с использованием вами стандартного JDK Collector, который выдает удвоения, как указано в имени метода:

Collectors.summarizingDouble(t -> t.x)

j поставляется с собственным наборомCollector API построения в org.jooq.lambda.Agg.В вашем случае вы хотите использовать 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)));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...