Java8 Эффективно Окончательная ошибка времени компиляции для не конечной переменной

Я пытаюсь изменить логическую переменную внутри цикла java8 forEach на true, которая не является окончательной. Но я получаю следующую ошибку: Локальная переменная, определенная в охватывающей области, должна быть окончательной или окончательной.

Как разрешить эту ошибку?

Код:

boolean required = false; 

Это переменная, которую я создал в этой функции.

Теперь, когда я пытаюсь изменить его:

  map.forEach((key, value) -> { System.out.println("Key : " + key + " Value : " + value); required = true; }); 

Я получаю ошибку: Локальная переменная, определенная в охватывающей области, должна быть окончательной или окончательной.

Почему возникает эта ошибка и как ее решить?

Вы не можете изменить локальную переменную из тела lambda-выражения. Существует несколько способов преодоления этого:

  • В этом конкретном случае вы можете просто установить boolean required = !map.isEmpty(); без какого-либо lambda-выражения. Если вы хотите установить его на основе некоторого условия, вы можете использовать Stream API:

     boolean required = map.entrySet().stream().anyMatch(entry -> ...); 

    Это решение является наиболее предпочтительным.

  • Преобразуйте required переменную в поле classа.

  • Самый грязный способ: объявить одноэлементный массив: boolean[] required = {false}; и вместо этого установите этот элемент: required[0] = true;