#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);