1. Обзор
В этом быстром учебнике мы научимся найти элементы из одного списка на основе значений из другого списка, используя Java 8 Потоки .
2. Использование потоков Java 8
Начнем с двух классов сущности – Сотрудник и Департамент :
class Employee { Integer employeeId; String employeeName; // getters and setters } class Department { Integer employeeId; String department; // getters and setters }
Идея здесь заключается в фильтрации списка Сотрудник объекты на основе перечня Департамент Объектов. Точнее, мы хотим найти все Сотрудники из списка, который:
- имеют “продажи”, как их отдел и
- иметь соответствующую сотрудникИд в списке Департамент секунда
И для достижения этой цели, мы на самом деле фильтровать один внутри другого:
@Test public void givenDepartmentList_thenEmployeeListIsFilteredCorrectly() { Integer expectedId = 1002; populate(emplList, deptList); ListfilteredList = emplList.stream() .filter(empl -> deptList.stream() .anyMatch(dept -> dept.getDepartment().equals("sales") && empl.getEmployeeId().equals(dept.getEmployeeId()))) .collect(Collectors.toList()); assertEquals(1, filteredList.size()); assertEquals(expectedId, filteredList.get(0) .getEmployeeId()); }
После заполнения обоих списков, мы просто проходим поток Сотрудник объектов к потоку Департамент Объектов.
Далее, чтобы фильтровать записи на основе наших двух условий, мы используем anyMatch предикат, внутри которых мы объединили все данные условия.
Наконец, мы собирать результат в фильтрованныйlist .
3. Заключение
В этой статье мы узнали, как:
- Значения потока одного списка в другой список с помощью Коллекционая трем и
- Объедините несколько условий фильтра с помощью anyMatch () предикат
Полный исходный код этого примера доступен более на GitHub .