Как выполнить итерацию по карте, содержащей объекты списка в качестве значения, и получить их как отдельный объект списка с помощью потоков Java 8

#java #lambda #java-8 #java-stream

Вопрос:

Существует два класса:

 public class Company {
    
    String name;
    int regId;
    List<Employee> employee;

    //getters and setters
    //constructor
}
 
 public class Employee {
    int id;
    String name;
    // getters and setters
    // constructor
}
 

В Map<String, Company> качестве ключа используется строка, а в качестве значения-объект типа Company.
Компания содержит список сотрудников в качестве одного из объектов-участников.

Теперь мне нужно перебрать карту, получить список сотрудников из каждого объекта Компании и добавить его в отдельный объект ArrayList.

Я не уверен, как получить список сотрудников объекта, выполнив итерацию по карте с использованием концепции потоков, и сохранить его в виде отдельного списка массивов.

Есть какие-нибудь предложения по этому поводу?

Комментарии:

1. map.values().stream().flatMap(v -> v.getEmployees().stream()).collect(Collectors.toList()) ?

2. @Vishal Вы хотите, чтобы все сотрудники были в одном большом списке?

3. @BuildSlayer — Да, все сотрудники в одном списке

Ответ №1:

Вы можете сделать:

 Map<String, Company> stringCompanyMap = new HashMap<>();
stringCompanyMap.put("Dsa", new Company("Nike", 1, Arrays.asList(
        new Employee(1, "Jordan"),
        new Employee(2, "Mike"))));
stringCompanyMap.put("Sd", new Company("Adidas", 1, Arrays.asList(
        new Employee(3, "Tyson"),
        new Employee(4, "Russel"))));

List<Employee> allEmployees = stringCompanyMap.values().stream()
        .flatMap(company -> company.employee.stream())
        .collect(Collectors.toList());

System.out.println(allEmployees);
 

Выход:

 [Employee(id=3, name=Tyson), Employee(id=4, name=Russel), Employee(id=1, name=Jordan), Employee(id=2, name=Mike)]
 

Комментарии:

1. Используя приведенный выше код, первый объект сотрудника дважды сохраняется в списке, а затем остальные объекты. Например: если на карте есть два значения(Компания 1 , Компания 2), и в Компании 1 есть сотрудник E1, а в компании 2 есть сотрудник E2, оно сохраняется как <E1,E1,E2>

2. @Vishal Если сотрудник не работает в двух компаниях, этого не происходит. Я отредактировал, чтобы продемонстрировать это.

Ответ №2:

Это также можно решить с помощью этого :-

 List<List<Employee>> tempEmployeesList;  //Temporary list for holding list of list of Employees
List<Employee>  empList = new ArrayList<>(); //Actual list for holding list of all employees in the Companies present in map values.

tempEmployeesList = map.values().stream().map(x -> x.getEmployee()).collect(Collectors.toList());
tempEmployeesList.forEach(empList::addAll); 
System.out.println(empList);