1. Обзор
В этом кратком руководстве мы узнаем, как находить элементы из одного списка на основе значений из другого списка с помощью Java 8 Streams .
2. Использование потоков Java 8
Начнем с двух классов сущностей — Employee
и Department
:
class Employee {
Integer employeeId;
String employeeName;
// getters and setters
}
class Department {
Integer employeeId;
String department;
// getters and setters
}
Идея здесь состоит в том, чтобы отфильтровать список объектов Employee
на основе списка объектов Department
. В частности, мы хотим найти всех сотрудников
из списка, который:
- иметь «продажи» в качестве своего отдела и
- иметь соответствующий employeeId
в
спискеотделов
И для этого мы будем фильтровать одно внутри другого:
@Test
public void givenDepartmentList_thenEmployeeListIsFilteredCorrectly() {
Integer expectedId = 1002;
populate(emplList, deptList);
List<Employee> filteredList = 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());
}
После заполнения обоих списков мы просто передаем объекты Stream of Employee
объектам Stream of Department
.
Затем, чтобы отфильтровать записи на основе наших двух условий, мы используем предикат anyMatch
, внутри которого мы объединили все заданные условия.
Наконец, мы собираем
результат в filteredList
.
3. Заключение
В этой статье мы узнали, как:
- Потоковые значения одного списка в другой список с помощью потока
Collection#
s
и - Объедините несколько условий фильтрации, используя предикат
anyMatch().
Полный исходный код этого примера доступен на GitHub .