Потоки Java 8: поиск элементов из одного списка на основе значений из другого списка
1. обзор
В этом кратком руководстве мы узнаем, какfind items from one list based on values from another list using Java 8 Streams.
2. Использование потоков Java 8
Начнем с двух классов сущностей -Employee andDepartment:
class Employee {
Integer employeeId;
String employeeName;
// getters and setters
}
class Department {
Integer employeeId;
String department;
// getters and setters
}
The idea here is to filter a list of Employee objects based on a list of Department objects. В частности, мы хотим найти всеEmployees из списка, который:
-
иметь «продажи» в качестве своего отдела и
-
имеют соответствующийemployeeId в спискеDepartments
И для этого мы будем фильтровать одно внутри другого:
@Test
public void givenDepartmentList_thenEmployeeListIsFilteredCorrectly() {
Integer expectedId = 1002;
populate(emplList, deptList);
List 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());
}
После заполнения обоих списков мы просто передаем поток объектовEmployee objects в поток объектовDepartment.
Next, to filter records based on our two conditions, we’re using the anyMatch predicate,, внутри которого мы объединили все данные условия.
Наконец, мыcollect результат вfilteredList.
3. Заключение
В этой статье мы узнали, как:
-
Поток значений одного списка в другой список с помощьюCollection#stream and
-
Объедините несколько условий фильтрации с помощью спредикатаanyMatch()
Полный исходный код этого примера доступенover on GitHub.