Java 8 Streams:他のリストの値に基づいてあるリストから項目を見つける

Java 8ストリーム:別のリストの値に基づいて1つのリストからアイテムを見つける

1. 概要

このクイックチュートリアルでは、find items from one list based on values from another list using Java 8 Streamsの方法を学習します。

2. Java 8ストリームの使用

Employee Departmentの2つのエンティティクラスから始めましょう。

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 を検索します。

  • 部門として「営業」を持ち、

  • Departmentsのリストに対応するemployeeIdがある

これを実現するために、実際に一方を他方の内部でフィルタリングします。

@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 オブジェクトのストリームをDepartmentオブジェクトのストリームに渡すだけです。

Next, to filter records based on our two conditions, we’re using the anyMatch predicate,は、指定されたすべての条件を組み合わせたものです。

最後に、結果をfilteredListcollectします。

3. 結論

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

  • Collection#stream andを使用して、一方のリストの値をもう一方のリストにストリーミングします

  • anyMatch() predicateを使用して複数のフィルター条件を組み合わせる

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