#java
Вопрос:
Я хочу написать метод, который находит всех сотрудников (объекты) из всех проектов, которые работают более 8 часов в день в новом наборе, и возвращает это set
.
Для этого у меня уже есть a project class
, в котором a map
каждого сотрудника является ключом, а часы, которые они работают в день, — ценностью.
В классе, в котором я пишу метод, у меня есть набор проектов, который содержит все объекты проекта.
Можно ли использовать функциональный интерфейс / поток для:
- выполните итерацию по набору проектов
- затем для каждого проекта выполняется итерация и фильтрация (более 8) по всем значениям на карте с сотрудниками в проекте
- верните всех сотрудников, которые работают более 8 часов в день в комплекте.
public Set<Employee> getFulltimeEmployees() { Set<Employee> emp = projects .forEach(p -> p.getCommittedHoursPerDay().forEach()); return Set.of(); }
У меня есть что-то подобное, но я не думаю, что это сработает.
projects
является набором всех Project objects
и getCommittedHoursPerDay()
возвращает значение map
с указанием в Employee object
качестве key
и часов работы в день в качестве value
.
Ответ №1:
Я бы подумал, что самым простым способом было бы использовать потоки. Приведенный ниже код транслирует все проекты, а затем сопоставляется с записями на карте. Затем он фильтрует все записи с часами > 8 и собирает ключи в набор (который автоматически удаляет дубликаты).
projects.stream()
.flatMap(p -> p.getCommittedHoursPerDay().entrySet().stream())
.filter(e -> e.getValue() > 8)
.map(Map.Entry::getKey)
.collect(Collectors.toSet());
Комментарии:
1. Спасибо! Я уже просматривал поток flatmap, спасибо, но когда я пробую ваш код, он говорит, что не может разрешить метод getKey()
2. @RonnyGiezen вам нужно сопоставить ключ, а также Установить<Сотрудник> emp = проекты.поток() .Плоская карта(p -<Сотрудник>> p.getCommittedHoursPerDay().entrySet().поток()) .фильтр(e -<Сотрудник>>> e.GetValue() <Сотрудник>>>> 8).карта(Map.Entry::getKey) .сбор(Сборщики.toSet()); будет работать