Java 8 lambda聚合
我对兰博达斯有点小问题。我如何迭代它,并在每次迭代中为变量currentLateAmountDouble添加值Java 8 lambda聚合,java,for-loop,lambda,Java,For Loop,Lambda,我对兰博达斯有点小问题。我如何迭代它,并在每次迭代中为变量currentLateAmountDouble添加值 正如错误消息所说,您不能从lambda重新分配外部局部变量(就像在Java7中从匿名类重新分配外部局部变量一样) 试图通过函数操作修改外部状态是一种代码味道。但您的操作只是一个映射,然后是一个缩减操作:将每个元素转换为一个BigDecimal,然后对所有BigDecimal求和: BigDecimal currentLateAmountDouble = lines.stream
正如错误消息所说,您不能从lambda重新分配外部局部变量(就像在Java7中从匿名类重新分配外部局部变量一样) 试图通过函数操作修改外部状态是一种代码味道。但您的操作只是一个映射,然后是一个缩减操作:将每个元素转换为一个BigDecimal,然后对所有BigDecimal求和:
BigDecimal currentLateAmountDouble =
lines.stream()
.map(line -> NumberUtils.getAmount(line.getDoubleValue(RContractLine.TotalAmountOpen)))
.reduce(BigDecimal.ZERO, BigDecimal::add);
请注意,将
filter()
的结果与null进行比较的测试没有意义:filter()
永远不会返回null。您可能正在此处查找anyMatch
。正如错误消息所述,您不能从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。您可能正在此处查找任何匹配项。您需要使用一个缩减函数
在你的if语句中试试这个
currentLateAmountDouble = lines.stream().mapToInt(l->NumberUtils.getAmount(l.getDoubleValue( RContractLine.TotalAmountOpen)).sum();
这可能不准确,我不是用电脑来测试的,但应该能让你离得足够近
另外,请参见以供参考您需要使用一个减少功能
在你的if语句中试试这个
currentLateAmountDouble = lines.stream().mapToInt(l->NumberUtils.getAmount(l.getDoubleValue( RContractLine.TotalAmountOpen)).sum();
这可能不准确,我不是用电脑来测试的,但应该能让你离得足够近
另外,请参见以获取参考
currentLateAmountDouble = lines.stream().mapToInt(l->NumberUtils.getAmount(l.getDoubleValue( RContractLine.TotalAmountOpen)).sum();