Рубрики
Без рубрики

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

Узнайте, как использовать данные из одного потока для поиска элементов в другом

Автор оригинала: baeldung.

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 .