Как преобразовать Long в BigDecimal, используя при этом поток

Я изо всех сил пытаюсь понять, как я могу заставить работать следующий код.

Поле count_human_dna моего stat class имеет тип BigDecimal, с установкой типа Long это работает, но мне нужно изменить его на BigDecimal, может как-нибудь сказать мне, как я могу заставить это работать для поля BigDecimal?

stat.setCount_human_dna(dnaSamples.stream()
    .filter(x -> x.getType().equals("Human"))
    .collect(Collectors.counting()));

Этот код подсчитывает все типы dnaSamples, принадлежащие человеку.

Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
0
21
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте метод BigDecimal#valueOf для преобразования из long в BigDecimal.

stat.setCount_human_dna(BigDecimal.valueOf(dnaSamples.stream().filter(x -> x.getType().equals("Human")).collect(Collectors.counting())));

См. JavaDocs для более подробной информации.

Это предполагает, что сборщик counting не переполняет счетчик long, который он использует. Конечно, переполнение маловероятно... но если это так, то почему свойство count_human_dna должно быть BigDecimal?

Stephen C 18.05.2022 05:07

В случае, если возможно, что он переполняется, я не уверен, возможно ли это с потоками, чтобы иметь счет как bigdecimal с самого начала

BugsOverflow 18.05.2022 05:16

Если мои расчеты верны, и вы считаете молекулы ДНК человека, то вам нужно 30-35 тонн чистой ДНК, чтобы получить число, слишком большое для long. Если ваши образцы больше одной молекулы, увеличьте их соответствующим образом.

Dawood ibn Kareem 18.05.2022 05:22

Вам не нужно использовать сборщик, просто примените count() как терминальную операцию.

Alexander Ivanchenko 18.05.2022 05:25
Ответ принят как подходящий

Этого можно добиться, используя reduce() терминальную операцию:

stat.setCount_human_dna(getDNACount(dnaSamples));
public static BigDecimal getDNACount(Collection<Sample> dnaSamples) {
    return dnaSamples.stream()
        .filter(x -> x.getType().equals("Human"))
        .reduce(BigDecimal.ZERO, (total, next) -> total.add(BigDecimal.ONE), BigDecimal::add);
}

Примечание: Я не специалист в таких вопросах, как анализ ДНК, но результатом этого сокращения всегда будет целое число. Вы можете использовать BigInteger вместо BigDecimal.

Спасибо, я все еще совершенствуюсь и учусь правильно использовать все эти вещи функциональной парадигмы :)

BugsOverflow 18.05.2022 05:30

Другие вопросы по теме