Java 8 Streams: поиск элементов из одного списка на основе значений из другого списка

Потоки 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.