Не могли бы вы дать мне несколько советов, как я могу решить эту проблему, пожалуйста?
Почему это происходит? Вы можете прочитать об этом здесь: Lambdas: локальные переменные должны быть окончательными, переменные экземпляра не
Минимальные изменения для решения вашей проблемы: не используйте саму переменную i
. Создайте его копию и сделайте final
.
final int iCopy = i;
Optional<RiskFilters> filter_payload = filterList.stream().filter(f -> newFiltersPositionsList.get(iCopy).getId() == f.getId()).findAny();
Например, можно ли пропустить цикл for и использовать, возможно, stream в stream?
Вы можете попробовать:
// replace the for-loop
// or just.... `newFiltersPositionsList.forEach(/* ... */)`
newFiltersPositionsList.stream().forEach(filterPosition -> {
Optional<RiskFilters> filter_payload = filterList.stream()
.filter(f -> filterPosition.getId() == f.getId())
.findAny();
RiskFilters filter = filter_payload.get();
filter.setPosition(filterPosition.getPosition());
riskFilterService.save(filter);
});
Кроме того, вы можете использовать для каждого вместо для цикла :
for (ChangeOrderRiskFiltersDTO filterPosition : newFiltersPositionsList) {
Optional<RiskFilters> filter_payload = filterList.stream()
.filter(f -> filterPosition.getId() == f.getId())
.findAny();
RiskFilters filter = filter_payload.get();
filter.setPosition(filterPosition.getPosition());
riskFilterService.save(filter);
}