Ещё один способ реализовать переход на вчерашнюю лямбду в IDEA

· автор BaRoN · На чтение уйдёт 2 минуты · (354 слова)

Вчера в статье про лямбда-функцию для удобной работы с DTO я написал, как создавался Live Template в IDEA. Сегодня, на другом компьютере, передо мной снова встала та же самая задача, и был выбор: взять готовый живой шаблон или попробовать другим способом. Я решил выбрать второй вариант. Вообще говоря, он даже проще и возможно, лучше. На этот раз названия переменных будут несколько отличаться: dto и target. Начну с того, что напишу необходимые методы в три строчки, затем воспользуюсь заменой с использованием регулярных выражений:

	dto.getIndex()
	dto.getType()
	dto.getName()

Заменим dto.get(.*)\(\)$ на Optional.ofNullable(dto.get$1()).ifPresent(target::set$1); и всё, должно получиться:

	Optional.ofNullable(dto.getIndex()).ifPresent(target::setIndex);
	Optional.ofNullable(dto.getType()).ifPresent(target::setType);
	Optional.ofNullable(dto.getName()).ifPresent(target::setName);

До тех пор, пока внутри не другой DTO, всё работает прекрасно и даже лучше предыдущего метода. Так, да не так. Во-первых, надо думать над регэкспом, чтобы написать его так, чтобы не пострадал другой код (подсказка: можно сделать это в Scratch File или применив регулярное выражение лишь к текущему выделению). Во-вторых, IDEA не очень нравится, когда строчки не являются валидным кодом, она начинает городить лесенку. Лесенка ничем не помешает, к тому же потом можно просто переформатировать код и всё, но это неудобно :).

Теперь про регулярное выражение. Я использовал в регэкспе последним символом знак $, чтобы не задеть существующий код. Также можно было бы этот знак убрать, но выполнить замену только в пределах выделенного кода (само собой, предварительно всё так же написав список методов и выделив его). В таком виде, как сейчас, регулярку можно вызывать неограниченное количество раз. На самом деле чаще всего так и будет, потому что никогда не знаешь, в какой момент в модели всё же появится новое поле, а писать новую строчку всё-таки очень неудобно.

И меня всё ещё не оставляет мысль о том, чтобы сделать автоматический генератор кода, чтобы он работал с любыми полями и сам, автоматически. Все необходимые аннотации под генератор [Mapstruct] (http://mapstruct.org/) в проекте уже есть, так что вполне органичным и естественным кажется либо написание некого плагина к mapstruct, либо наследника от их генератора, либо тупо просто добавить соответствующий код в их проект. Как бы ни была удобна IDEA, когда всё делается автоматически - это ещё удобнее и надёжнее. И всё как я люблю: лучше день потерять, а потом за пять минут долететь.

Полезное