В IntelliJ IDEA существует довольно удобный механизм для автоматической проверки (при необходимости — и преобразования) кода, под название Code inspections. Сложилось так, что мне понадобилось добавить к нему собственное поведение, служащее для замены способа преобразования непустого Optional в его значение внутри стрима (из стиля Java 8 в стиль Java 9+).
Не то, чтобы добавление пользовательских инспекций было трудным делом, но для памяти и в качестве небольшого примера решил описать этот процесс чуть подробней.
Итак, для начала надо попасть в само меню конфигурации инспекций, проще всего — по нажатию Ctrl+Alt+Shift+H -> Configure inspections
. Там можно добавить Replace Template («плюсик» в верхней части окна) со следующими настройками (актуальны для моего примера):
Затем, при желании, при помощи Edit Metadata можно добавить к шаблону некоторую дополнительную информацию:
И, в общем-то, на этом — всё! Несколько коротких действий экономят достаточно много времени впоследствии (ну и замечания по стилю не приходится исправлять, т.к. их предотвращает наличие инспекции с преобразованием).
Результат в действии выглядит следующим образом (gif с анимацией, запускается по клику):
Проверял на таком небольшом примере:
Stream.of(getOptional())
.filter(Optional::isPresent)
.map(Optional::get)
.count();
public static Optional getOptional() {
return (new Random().nextInt() > 0)
? Optional.of("Yes")
: Optional.empty();
}
И, в заключение, пара ссылок по теме создания Code inspections в idea:
- Более подробное описание создания Search Templates в idea
- Статья на хабре IntelliJ IDEA: Structural Search & Replace
И тест создания шаблона:
Filter and get presented Optional in Stream
Stream filter() and map() operations may be simplified to flatMap()
In Java 9 and highest a .filter() and .map() stream operations used for get non-empty Optional object may be replaced to .flatMap() operation for simplify.