Lesson 57 (stream collect collector)#103
Lesson 57 (stream collect collector)#103Binary-Cat-01 wants to merge 1 commit intoKFalcon2022:for-prfrom
Conversation
| public List<Employee> calculate(List<Department> departments) { | ||
| return null; | ||
| return departments.stream() | ||
| .flatMap(d -> d.getEmployees() |
There was a problem hiding this comment.
Вложенные цепочки вызовов обычно усложняют читаемость кода. Вполне можно заменить на map+flatMap
| return departments.stream() | ||
| .flatMap(d -> d.getEmployees() | ||
| .stream()) | ||
| .distinct() |
| return null; | ||
| return departments.stream() | ||
| .flatMap(d -> d.getEmployees() | ||
| .stream()) |
There was a problem hiding this comment.
то же, что и выше, дальше подобное не буду дублировать
| return departments.stream() | ||
| .flatMap(d -> d.getEmployees() | ||
| .stream()) | ||
| .distinct() |
| return departments.stream() | ||
| .collect(Collectors.groupingBy(Department::getName, Collectors.flatMapping( | ||
| d -> d.getEmployees() | ||
| .stream(), Collectors.averagingDouble(Employee::getAge)))); |
There was a problem hiding this comment.
я очень большой сторонник правила точка-строчка, но когда стрим или другая цепочка - не единственный параметр метода, смотрится такая конструкция мутно
| .collect(Collectors.groupingBy(Department::getName, Collectors.teeing(Collectors.flatMapping( | ||
| d -> d.getEmployees() | ||
| .stream() | ||
| .filter(e -> !e.isMale()), Collectors.counting()), Collectors.flatMapping( |
There was a problem hiding this comment.
Collectors.flatMapping( логичнее бы на след строку перенести. Как и предыдущий
| d -> d.getEmployees() | ||
| .stream(), | ||
| Collectors.collectingAndThen(Collectors.summarizingInt(Employee::getAge), | ||
| s -> s.getMax() - s.getMin())))); |
There was a problem hiding this comment.
считаем лишние параметры, в остальном - элегантное решение
There was a problem hiding this comment.
Пожалуй, лучшее, чем предложено в разборе
| return departments.stream() | ||
| .flatMap(d -> d.getEmployees() | ||
| .stream()) | ||
| .filter(e -> !e.isMale()) |
| .flatMap(d -> d.getEmployees() | ||
| .stream()) | ||
| .filter(e -> !e.isMale()) | ||
| .distinct() |
| .stream()) | ||
| .filter(e -> !e.isMale()) | ||
| .distinct() | ||
| .collect(Collectors.collectingAndThen(Collectors.toList(), women -> women.size() > 30 ? |
There was a problem hiding this comment.
Я в таких случаях обычно предпочитаю Optional и цепочку уже в нем отстраивать. Чуть легче разбирать
| .flatMap(d -> d.getEmployees() | ||
| .stream()) | ||
| .distinct() | ||
| .collect(Collectors.teeing(Collectors.filtering(Employee::isMale, Collectors.toList()), |
There was a problem hiding this comment.
teeing - штука, которую в дальнейшем советую не юзать без крайней необходимости. Бывает слишком сложно разобрать, что к чему, если логика нетривиальная. Что до лишнего списка - он, считай, идет по цене вызова фильтров и создания самого объекта списка. Т.е. там не будет именно х2 прогона каждого элемента, если тебя это беспокоило. Просто к каждому элементу при обработке применится по два набора операций
| .flatMap(d -> d.getEmployees() | ||
| .stream()) | ||
| .distinct() | ||
| .collect(Collectors.teeing(Collectors.filtering(Employee::isMale, Collectors.counting()), |
There was a problem hiding this comment.
кажется, перенеси ты Collectors.filtering(Employee::isMale, Collectors.counting()), - читать было бы чутка легче
| d -> d.getEmployees() | ||
| .stream() | ||
| .filter(e -> !e.isMale()) | ||
| .distinct(), Collectors.counting()), (mans, women) -> mans > women))); |
| return null; | ||
| return departments.stream() | ||
| .collect(Collectors.toMap(Department::getName, | ||
| d -> (double) d.getVacancyAmount() * 100 / d.getEmployees() |
There was a problem hiding this comment.
домножение на 100 - удел отвечающих за отображение данных:) шутка, но в каждой шутке...
| return departments.stream() | ||
| .collect(Collectors.toMap(Department::getName, | ||
| d -> (double) d.getVacancyAmount() * 100 / d.getEmployees() | ||
| .size())); |
There was a problem hiding this comment.
лишний перенос. Цель понятна, но читаемость портит
| @Override | ||
| public Integer calculate(List<Department> departments) { | ||
| return null; | ||
| return departments.stream().mapToInt(Department::getVacancyAmount).sum(); |
| return null; | ||
| return departments.stream() | ||
| .map(Department::getName) | ||
| .collect(Collectors.joining(", ", "", ".")); |
No description provided.