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);
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());
} После заполнения обоих списков, мы просто проходим поток Сотрудник объектов к потоку Департамент Объектов.
Далее, чтобы фильтровать записи на основе наших двух условий, мы используем anyMatch предикат, внутри которых мы объединили все данные условия.
Наконец, мы собирать результат в фильтрованныйlist .
3. Заключение
В этой статье мы узнали, как:
- Значения потока одного списка в другой список с помощью Коллекционая трем и
- Объедините несколько условий фильтра с помощью anyMatch () предикат
Полный исходный код этого примера доступен более на GitHub .