Переменные внутри лямбда-выражения или любого анонимного внутреннего класса должны быть окончательными или эффективно конечными.
Это происходит потому, что эти переменные копируются в область лямбда-выражения.Если бы на них ссылались, а не на копировали, возникла бы проблема, когда переменная выходит из области действия своей зоны объявления, в то время как лямбда-область все еще выполняется (подумайте о потоках).
Определяя массив, вы работаетевокруг этой проблемы: вы принудительно ссылаетесь на значение с помощью эффективно окончательного массива (вы инициализируете массив один раз и никогда не меняете его).
Конечные и эффективно окончательные переменные можно безопасно скопировать, зная, что их значениене собирается меняться.
Когда массив выходит из области видимости, нет проблем, GC по-прежнему содержит указатель на ваше значение изнутри области лямбды, и он не будет собирать мусор до тех пор, пока лямбда иобъявление зоны вне области действия.
Вы можете сделать то же самое со списком или любой другой коллекцией.Это также будет работать с классом-оболочкой.