首页 > 解决方案 > 将 for 循环重构为 Java 8 并行流

问题描述

public Double getTotal()
{
    Double totalAmount = 0D;
    long memberCount = 200;
    List<Fee> fees = feesMngr.all();
    for (FeeDto fee : fees)
    {
        if(fee.type.equals(FeeType.REGISTRATION))
        {
            Optional<Year> currentYear = this.getCurrentYear();
            if(currentYear.isPresent())
            {
                FeeDto addServiceCharge = feesMngr.getFeeByType(FeeType.SERVICE_FEE);
                totalAmount +=(addServiceCharge.getAmount() * memberCount);

            }
            if(feesMngr.getFeeByType(FeeType.LIBRARY_FEE) != null)
            {
                totalAmount += (200 * memberCount);
            }
        }
        else{
            totalAmount += (fee.getAmount() * memberCount);
        }
    }

    return totalAmount;
}

我做了类似以下的事情,但不断出现红线;告诉我“从 lambda 表达式引用的局部变量必须是最终的或有效的最终”。当我宣布 totalAmount 最终时,仍然没有解决任何问题。

fees.parallelStream()
            .forEach(
                    (fee) -> {

                        if (fee.getType().equals(FeeType.REGISTRATION.name())) {

                            FeeDto addServiceCharge = feesMngr.getFeeByType(FeeType.SERVICE_FEE);

                            totalAmount += (fee.getAmount() * memberCount);

                        }
                        else {
                            totalAmount += (fee.getAmount() * memberCount);
                        }
                    });

标签: javajava-stream

解决方案


在第一步中,为每个条件获取金额值。之后,您可以进行整个计算:

        long memberCount = 200;
        return feesMngr.all().parallelStream().map(fee -> {
            if (fee.type.equals(FeeType.REGISTRATION)) {
                Optional<Year> currentYear = this.getCurrentYear();
                if (currentYear.isPresent()) {
                    return feesMngr.getFeeByType(FeeType.SERVICE_FEE).getAmount();
                }
                if (feesMngr.getFeeByType(FeeType.LIBRARY_FEE) != null) {
                    return 200D;
                }
                return 0D;
            } else {
                return fee.getAmount();
            }
        }).reduce(0D, (subAmount, factor) -> subAmount + (factor * memberCount));

推荐阅读