Есть ли способ изменить значение внутри в лямбда-выражении?

#java #lambda

#java #лямбда

Вопрос:

Я хочу изменить feeAmount и message, используя цикл for, который я сделал, но я хочу использовать Lambda (по умолчанию все переменные являются конечными в Lambda).

         gridFeeEntity.stream().forEach(entity -> {
        if ("T".equals(entity.getType())){

            feeAmount  = 1;

        }else if ("P".equals(entity.getType())) {

            feeAmount  = 2;

        } else {
            message = "not Supported";
        }
    });
  

Ответ №1:

В дополнение к ответу Тима я бы предложил рассмотреть возможность инвертирования вашей логики. (Обратите внимание, что ваш бит «сообщения» почти наверняка должен быть исключением.)

 int feeIncrease = gridFeeEntities.stream()
  .map(GridFeeEntity::getType)
  .mapToInt(FeeList::forType)
  .sum();

feeAmount  = feeIncrease;
  

Комментарии:

1. .. и FeeList#forType должен возвращать целое число при условии, что тип объекта абстрагирует основную логику.

Ответ №2:

Потоки не идеальны для каждого варианта использования, и я бы предпочел использовать здесь простой расширенный for цикл:

 for (GridFeeEntity entity : gridFeeEntity) {
    if ("T".equals(entity.getType())) {
        feeAmount  = 1;
    }
    else if ("P".equals(entity.getType())) {
        feeAmount  = 2;
    }
    else {
        message = "not Supported";
    }
}
  

Это чисто, легко читается и все равно должно работать примерно так же, как stream, особенно для небольших коллекций.

Комментарии:

1. Да, в конце концов я так и сделал.