java - 解析流函数中的对象

标签 java java-stream bigdecimal

如何在流函数中将 String 解析为 BigDecimal,我想将属性设置为 String,然后将其解析为 BigDecimal,最后通过计算从每个对象中获取的总和来获得总和。 (目前在 BigDecimal::add 上有一条消息无法解析方法添加)谢谢。

public Optional<BigDecimal> generalTotalForSingleInvoice(PDDocument pdDocument) {
    return Optional.of(new BigDecimal(findFirst(extractText(pdDocument), INVOICE_GENERAL_TOTAL)
            .replaceAll("\\.", "")
            .replaceAll(",", ".")).stripTrailingZeros());
}

public Optional<BigDecimal> sumOfGeneralTotal(List<PDDocument> document) {
    return document.stream().map(this::generalTotalForSingleInvoice).reduce(BigDecimal.ZERO, BigDecimal::add);

}

最佳答案

您正在创建一个 Stream<Optional<BigDecimal>> , 你不能减少 StreamBinaryOperator<BigDecimal> , 所以 BigDecimal::add不合适。

由于您的 generalTotalForSingleInvoice永远不能返回一个空的 Optional , 它没有理由返回 Optional .您可以将其更改为:

public BigDecimal generalTotalForSingleInvoice(PDDocument pdDocument) {
    return new BigDecimal(findFirst(extractText(pdDocument), INVOICE_GENERAL_TOTAL)
            .replaceAll("\\.", "")
            .replaceAll(",", ".")).stripTrailingZeros();
}

现在,您的原始 Stream管道将工作,但请注意 reduce您使用的变体不会返回 Optional (因为你传递的是一个标识值),所以你应该更改方法的返回类型:

public BigDecimal sumOfGeneralTotal(List<PDDocument> document) {
    return document.stream().map(this::generalTotalForSingleInvoice).reduce(BigDecimal.ZERO, BigDecimal::add);

}

关于java - 解析流函数中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59354614/

相关文章:

数据对象中许多字段的 Java 数字格式

java - ACM 竞赛中的斐波那契数列

java - "d = ut + 1/2 at^2"?在java中如何解决这个问题?

java - "if"是否总是等待方法完成?

Java8 : How to Convert Map<X, List<Y>> to Map<Y,X> using Stream?

Javascript 错误地更改了简单乘法的结果。我该如何解决?

java - 使用科学记数法将 BigDecimal 格式化为字符串,反之亦然

java - NullPointerException 机智简单 TabActivity

java - 使用 Streams 将 BigDecimals 相加

java - Stream 中 "filter then map"和 "map then filter"的性能是否不同?