Stream

时间:2015-12-02 14:11:13

标签: 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())));

最后一张地图是我试图对两个大十字的总和。 我知道我做错了什么。 任何人都可以给我一个关于如何使用Stream的建议。

我试图重构这个旧时尚代码

 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());
          }
      }
  }

问候。

2 个答案:

答案 0 :(得分:4)

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

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);

答案 1 :(得分:0)

听起来你想要使用" reduce"操作。 Reduce用于对整个流进行求和或添加查找最大值等操作。

(如果您希望对单个流元素进行添加,那么我的问题不明确,请添加详细信息)