Java流乘法并返回乘法和

时间:2019-11-19 18:04:18

标签: java java-stream bigdecimal

当前,我正在使用for循环执行简单的乘法并求和求和:

BigDecimal serviceOrderTotal = new BigDecimal(0.00);
for (int i = 0; i < orderPresenter.getServiceList().size(); i++) {
    System.out.println("orderPresenter.getServiceList().get(i).getServiceValue()");
    System.out.println(orderPresenter.getServiceList().get(i).getServiceValue());
    System.out.println("orderPresenter.getServiceList().get(i).getServiceQuantity()");
    System.out.println(orderPresenter.getServiceList().get(i).getServiceQuantity());
    serviceOrderTotalold = serviceOrderTotal.add(orderPresenter.getServiceList().get(i).getServiceValue().multiply(orderPresenter.getServiceList().get(i).getServiceQuantity()));
}

我需要使用流来做同样的事情。对于每个orderPresenters,我需要将数量乘以值并返回这些值的总和。

如果我在forEach中使用stream进行操作,我将无法返回该值,因为该变量必须为final或原子变量才能在forEach内部使用。我最终无济于事:

BigDecimal serviceOrderTotal = new BigDecimal(0.00);
serviceOrderTotal = orderPresenter.getServiceList().stream()
               .forEach(servicePresenter -> {
                    System.out.println("orderPresenter.getServiceValue()");
                    System.out.println(orderPresenter.getServiceValue());
                    System.out.println("orderPresenter.getServiceQuantity()");
                    System.out.println(orderPresenter.getServiceQuantity());
                    serviceOrderTotalold = serviceOrderTotalold.add(orderPresenter.getServiceValue().multiply(orderPresenter.getServiceQuantity()));
                });

2 个答案:

答案 0 :(得分:3)

您可以修改您的实现以使用foreach,例如:

BigDecimal serviceOrderTotal = BigDecimal.ZERO;
for (Service service : orderPresenter.getServiceList()) {
    serviceOrderTotal = serviceOrderTotal.add(service.getServiceValue().multiply(service.getServiceQuantity()));
}

这也可以使用java-stream的mapreduce操作来进一步转换,

BigDecimal serviceOrderTotal = orderPresenter.getServiceList().stream()
        .map(service -> service.getServiceValue().multiply(service.getServiceQuantity()))
        .reduce(BigDecimal.ZERO, BigDecimal::add);

答案 1 :(得分:2)

获得列表后,请执行此操作。不确定您的列表是什么样的。

BigDecimal sum = list.stream()
                     .map(sv -> sv.getServiceValue().multiply(sv.getServiceQuantity()))
                     .reduce(new BigDecimal(0.0), (a, b) -> a.add(b));