2. Упростить вложенные лямбда-выражения #
Условие задачи:
📌 Разобраться, что делает данный код, и улучшить читаемость за счёт рефакторинга.
public class AvoidComplexLambdas {
private final Set<User> users = new HashSet<>();
public Set<User> findEditors() {
return users.stream()
.filter(u -> u.getRoles().stream()
.anyMatch(r -> r.getPermissions().contains(Permission.EDIT)))
.collect(toSet());
}
}
Спойлеры к ответу
Подсказки
💡 Метод
💡 Вложенные лямбды ухудшают читаемость.
💡 Хорошей практикой будет вынести вложенную логику в отдельный метод с понятным названием.
findEditors()
ищет пользователей, которые имеют хотя бы одну роль с разрешением EDIT
.💡 Вложенные лямбды ухудшают читаемость.
💡 Хорошей практикой будет вынести вложенную логику в отдельный метод с понятным названием.
Решение
🔍 Что делает код? #
Метод findEditors()
:
Проходит по всем
users
,Фильтрует тех, у кого хотя бы одна
Role
содержит разрешениеPermission.EDIT
,Возвращает подходящих пользователей как
Set
.
✅ Как улучшить? #
Выносим вложенные лямбды в отдельный метод hasEditPermission(User u)
:
public class AvoidComplexLambdas {
private final Set<User> users = new HashSet<>();
public Set<User> findEditors() {
return users.stream()
.filter(this::hasEditPermission)
.collect(Collectors.toSet());
}
private boolean hasEditPermission(User user) {
return user.getRoles().stream()
.anyMatch(role -> role.getPermissions().contains(Permission.EDIT));
}
}
✨ Преимущества: #
Читаемость повышается.
Появляется возможность переиспользовать метод
hasEditPermission
.Упрощается отладка и тестирование.
🔥 Рефакторинг — это про чистый код, а не только про короткий код! 🧹