【发布时间】:2016-03-07 16:45:35
【问题描述】:
我在使用 lambdas 时遇到了一个小问题。如何遍历它并将每次迭代的值添加到我的变量 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))));
}
}
它在第 5 行给了我一个错误:
在封闭范围内定义的局部变量 currentLateAmountDouble 必须是 final 或有效 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);
【问题讨论】: