Stream 中的 Bigdecimals 求和

pau*_*aul 1 java lambda java-8 java-stream

我正在使用 Java 8 Stream,在其中迭代两个集合,在通过过滤器后,我想将流中的 bigdecimal 变量之一与外部 bigDecimal 变量“restrictionsNumber”相加

这是我的代码:

     final BigDecimal restrictionsNumber = cmd.amount.getNumberOfUnits();
        order.products()
             .stream()
             .flatMap(product -> product.getRestrictions()
                                    .stream()
                                    .filter(restriction -> restriction.equals(newProductRestriction))
                                    .map(restriction -> restrictionsNumber.add(product.getAmount()
                                                                            .getNumberOfUnits())));
Run Code Online (Sandbox Code Playgroud)

最后一张地图是我试图将两个 bigdecimals 相加的地图。我知道我做错了什么。谁能给我一个关于如何使用 Stream.js 做这件事的建议。

我正在尝试重构这个旧的时尚代码

 final BigDecimal restrictionsNumber = cmd.amount.getNumberOfUnits();
 for (Product product : order.products()) {
     for (String oldProductRestriction : product.getRestrictions()) {
         if (oldProductRestriction.equals(newProductRestriction)) {
            restrictionsNumber = restrictionsNumber.add(product.getAmount()
                                                                       .getNumberOfUnits());
          }
      }
  }
Run Code Online (Sandbox Code Playgroud)

问候。

ass*_*ias 6

这可能是您所需要的(但它会为每个产品多次添加相同的数量,与您的原始代码一致,这看起来很奇怪):

BigDecimal sum = order.products()
     .stream()
     .flatMap(product -> product.getRestrictions()
                  .stream()
                  .filter(restriction -> restriction.equals(newProductRestriction))
                  .map(restriction -> product.getAmount().getNumberOfUnits()))
     .reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal result = restrictionsNumber.add(sum);
Run Code Online (Sandbox Code Playgroud)

  • 如果这确实是预期的操作,计算匹配项的数量,然后进行乘法,使用 `map` 而不是 `flatMap` 会简化它。 (3认同)