Рефакторинг для цикла в параллельный поток Java 8 - PullRequest
0 голосов
/ 12 июня 2019
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;
}

Я сделал что-то вроде следующего, но продолжаю получать красные линии; говоря мне, что "локальные переменные, на которые ссылается лямбда-выражение, должны быть окончательными или эффективно окончательными". Все еще ничего не решает, когда я объявляю totalAmount final.

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

1 Ответ

0 голосов
/ 04 июля 2019

На первом шаге получите значение суммы для фактора для каждого условия.После этого вы можете сделать все вычисления:

        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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...