如何在使用 Stream 的同时将 Long 转换为 BigDecimal

How to convert Long to BigDecimal while also using a Stream

我正在努力理解如何使以下代码工作。

我的 stat class 的字段 count_human_dnaBigDecimal 类型,将类型设置为 Long 可以,但我需要将其更改为 BigDecimal,能以某种方式告诉我如何使 BigDecimal 字段有效吗?

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

此代码正在计算属于人类的所有 dnaSamples

使用BigDecimal#valueOf方法从long转换为BigDecimal

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

有关详细信息,请参阅 JavaDocs

最简单有效的方法是使用终端操作count(),其中returns流中的元素个数为long,然后转换为BigDecimal:

stat.setCount_human_dna(getDNACount(dnaSamples));
public static BigDecimal getDNACount(Collection<Sample> dnaSamples) {
    long humanSamples = dnaSamples.stream()
        .filter(x -> x.getType().equals("Human"))
        .count();

    return BigDecimal.valueOf(humanSamples);
}

并且您可以使用 reduce() 终端操作直接从流中生成类型 BigDecimal 的结果:

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

旁注:我不是DNA分析等问题的专家,但这种归约的结果永远是一个整数。您可以考虑使用 BigInteger 而不是 BigDecimal.