1. 概要

このクイックチュートリアルでは、Java 8ストリームを使用して、別のリストの値に基づいて1つのリストからアイテムを検索する方法を学習します。

2. Java8ストリームの使用

従業員部門の2つのエンティティクラスから始めましょう。

class Employee {
    Integer employeeId;
    String employeeName;

    // getters and setters
}

class Department {
    Integer employeeId;
    String department;

    // getters and setters
}

ここでの考え方は、Departmentオブジェクトのリストに基づいて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());
}

両方のリストにデータを入力した後、EmployeeオブジェクトのストリームをDepartmentオブジェクトのストリームに渡すだけです。

次に、2つの条件に基づいてレコードをフィルタリングするために、anyMatch述語を使用します。この述語内で、指定されたすべての条件を組み合わせています。

最後に、結果をcollectしてfilteredListにします。

3. 結論

この記事では、次の方法を学びました。

  • Collection#s tream を使用して、一方のリストの値をもう一方のリストにストリーミングします。
  • anyMatch()述語を使用して複数のフィルター条件を組み合わせる

この例の完全なソースコードは、GitHubから入手できます。