Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 1
Регистрация: 09.10.2013
Сообщений: 34

Final переменные для лямбд

23.02.2017, 13:24. Показов 2570. Ответов 2

Студворк — интернет-сервис помощи студентам
Есть некоторая коллекция цветов и некоторая коллекция кнопок (можно и не кнопок, суть не в них, суть в лямбдах). Циклом for каждой кнопке назначается ActionListener — отдельно написанная функция, принимающая в аргументы цвет из коллекции. Просто так лямбда (по крайней мере IntelliJ IDEA очень сильно ругается) не хочет принимать в качестве параметра итератор цикла. Сделал, конечно, некрасивое решение в виде создания final переменной в цикле, но меня морозит при просмотре моего кода, когда я вижу эту строку. Как правильнее использовать лямбда-выражения в данном случае: с итераторами цикла?

Весь код можно посмотреть на GitHub.

Код
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Внутри конструктора создаётся панель, на которую будут помещены кнопки
JPanel colors = new JPanel(new GridBagLayout());
// Создаётся коллекция кнопок
ArrayList<JButton> buttons = new ArrayList<>();
// Создаётся коллекция цветов
// colorsList — отдельный класс, хранящий все нужные цвета;
// getColorsList — отдаёт коллекцию этих цветов
ArrayList<Color> btnColors = colorsList.getColorsList();
// Для всех цветов
for (int i = 0; i < btnColors.size(); i++) {
    // Ненавистная мне строчка
    final int m = i;
    // В коллекцию кнопок добавляется кнопка
    buttons.add(new JButton());
    // Ей ставится цвет из коллекции цветов
    buttons.get(i).setBackground(btnColors.get(i));
    // Лямбда, которая не хочет принимать итератор, потому что это не final переменная
    // addColor — метод, который в будущем будет добавлять цвет в другую коллекцию,
    // собственно для чего проект и создавался, чтобы нажимать на цветные кнопки,
    // а их цвета добавлялись бы в некую коллекцию
    buttons.get(i).addActionListener(event -> addColor(btnColors.get(m)));
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.02.2017, 13:24
Ответы с готовыми решениями:

Final для полей
Здравствуйте, подскажите почему в первом случае компилятор ругается, а во втором нет: void f(final int i) { i++;} int g(final int i)...

Final для анонимного класса
Добрый день уважаемые. Такой вопрос, почему в коде, например таком public static void main(String args) { String s =...

В чем разница между “static final” VS “final”?
&quot;static final&quot; и &quot;final&quot;. Оба значения константы и изменению не подлежат. В чем же разница?

2
 Аватар для Borsche
183 / 110 / 44
Регистрация: 03.07.2016
Сообщений: 496
23.02.2017, 17:23
Насколько я понимаю лямбди, то переменные которые ты используешь в лямбде должны быть effective final, тоесть не изменяться в блоке кода где она используется, или даже во всём класе(не помню точно). У тебя же в цикле постоянно присваевается ей новое значение.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,780
23.02.2017, 21:09
Лучший ответ Сообщение было отмечено dimon4ezzz как решение

Решение

Цитата Сообщение от dimon4ezzz Посмотреть сообщение
но меня морозит при просмотре моего кода
Оденься потеплее

Java
1
2
3
for (int i = 0; i < btnColors.size(); i++) {
    ...
}
=>

Java
1
2
3
IntStream.range(0, btnColors.size()).forEach(i -> {
    ...
});
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.02.2017, 21:09
Помогаю со студенческими работами здесь

Final для вложенной структуры
class A{ class B {..} final; }; так класс B теперь входит в размер A, но не инициализируется. это баг? потому что я нигде не нашел...

Использование лямбд
Допустим есть 2 класса A и B, из B нужно вызывать некоторые методы из А, допустим таких методов немного 2-3 не более, а то и во все 1. ...

В чем плюсы лямбд?
В чем очевидные и/или измеряемые плюсы лямбд в C++? Повышает ли это скорость кода? Или памяти меньше? Или еще что-то? Ну кроме повышения...

Директива final для виртуальных методов. В чем ее смысл?
Суть вкратце: Если виртуальному методу написать final, то его нельзя будет наследовать: type Base = class procedure...

Верно ли такое использование лямбд
Доброй ночи. Есть функция: void setMouseCallback(const string&amp; winname, MouseCallback onMouse, void* userdata=0 ) На вход она принимает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru