Java 8 lambda聚合

Java 8 lambda聚合,java,for-loop,lambda,Java,For Loop,Lambda,我对兰博达斯有点小问题。我如何迭代它,并在每次迭代中为变量currentLateAmountDouble添加值 正如错误消息所说,您不能从lambda重新分配外部局部变量(就像在Java7中从匿名类重新分配外部局部变量一样) 试图通过函数操作修改外部状态是一种代码味道。但您的操作只是一个映射,然后是一个缩减操作:将每个元素转换为一个BigDecimal,然后对所有BigDecimal求和: BigDecimal currentLateAmountDouble = lines.stream

我对兰博达斯有点小问题。我如何迭代它,并在每次迭代中为变量currentLateAmountDouble添加值


正如错误消息所说,您不能从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();