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

1概要

このクイックチュートリアルでは、https://www.baeldung.com/java-8-streams-introduction[Java 8 Streams]** を使用して、別のリストの値に基づいて1つのリストの項目を検索する方法を学習します。

2 Java 8 Streamsの使い方

2つのエンティティクラス __Employee Department__から始めましょう

class Employee {
    Integer employeeId;
    String employeeName;

   //getters and setters
}

class Department {
    Integer employeeId;
    String department;

   //getters and setters
}
  • ここでの考え方は、 Department オブジェクトのリストに基づいて Employee オブジェクトのリストをフィルタ処理することです。

  • 部署として「売上」がある

  • __Department sのリストに対応する 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 オブジェクトのStreamを Department__オブジェクトのStreamに渡すだけです。

  • 次に、2つの条件に基づいてレコードをフィルタ処理するために、 anyMatch 述語を使用しています。

最後に、結果を filteredList に収集します。

3結論

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

  • を使って一方のリストの値をもう一方のリストに流す

__Collection#stream and ** anyMatch() __predicateを使用して複数のフィルター条件を組み合わせる

この例の完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/core-java-collections[GitHubで利用可能]です。