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,は、指定されたすべての条件を組み合わせたものです。
最後に、結果をfilteredListにcollectします。
3. 結論
この記事では、次の方法を学びました。
-
Collection#stream andを使用して、一方のリストの値をもう一方のリストにストリーミングします
-
anyMatch() predicateを使用して複数のフィルター条件を組み合わせる
この例の完全なソースコードは、over on GitHubで入手できます。