gpt4 book ai didi

Java 8 lambda 聚合

转载 作者:行者123 更新时间:2023-12-01 21:47:13 25 4
gpt4 key购买 nike

我在 lambda 方面遇到了一个小问题。如何迭代它并在每次迭代时为我的变量 currentLateAmountDouble 添加值?

BigDecimal currentLateAmountDouble = BigDecimal.ZERO;
Collection<VPO> lines = BO_Contract.getLines(trxName, contractVPO.getID(), RContractLine.LineNo + " ASC ", ctx);
if (lines != null && !lines.isEmpty()) {
if (lines.stream()
.filter(line -> onDate.compareTo(line.getDateValue(RContractLine.TermDate)) > 0) != null) {
lines.forEach(line -> currentLateAmountDouble = currentLateAmountDouble.add(NumberUtils.getAmount(line.getDoubleValue(RContractLine.TotalAmountOpen))));
}
}

它在第五行给了我一个错误:

Local variable currentLateAmountDouble defined in an enclosing scope must be final or effectively final

Java 7 中的相同方法(有效):

BigDecimal currentLateAmountDouble = BigDecimal.ZERO;
Collection<VPO> lines = BO_Contract.getLines(trxName, contractVPO.getID(), RContractLine.LineNo + " ASC ", ctx);
if (lines != null && !lines.isEmpty()) {
for (VPO line : lines) {
if (onDate.compareTo(line.getDateValue(RContractLine.TermDate)) > 0) {
currentLateAmountDouble = currentLateAmountDouble.add(NumberUtils.getAmount(line.getDoubleValue(RContractLine.TotalAmountOpen)));
}
}
}

编辑:已解决!使用@JBNizet解决方案并这样做:

currentLateAmountDouble = lines.stream().filter(line -> onDate.compareTo(line.getDateValue(RContractLine.TermDate)) > 0)
.map(line -> NumberUtils.getAmount(line.getDoubleValue(RContractLine.TotalAmountOpen))).reduce(BigDecimal.ZERO, BigDecimal::add);

最佳答案

正如错误消息所示,您不能从 lambda 重新分配外部局部变量(就像 Java 7 中的匿名类一样)。

尝试从功能操作修改外部状态是一种代码味道。但您的操作只是一个映射,然后是一个归约操作:您将每个元素转换为 BigDecimal,然后对所有 BigDecimal 求和:

BigDecimal currentLateAmountDouble = 
lines.stream()
.map(line -> NumberUtils.getAmount(line.getDoubleValue(RContractLine.TotalAmountOpen)))
.reduce(BigDecimal.ZERO, BigDecimal::add);

请注意,将 filter() 结果与 null 进行比较的测试没有意义:filter() 永远不会返回 null。您可能正在此处寻找 anyMatch

关于Java 8 lambda 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35849296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com