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.Упрощается отладка и тестирование.
🔥 Рефакторинг — это про чистый код, а не только про короткий код! 🧹