двойной поток forEach по набору и хэш-карте Java

#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()); будет работать