Java 8 Streams: Localizar itens de uma lista com base nos valores de outra lista
1. Visão geral
Neste tutorial rápido, aprenderemos comofind items from one list based on values from another list using Java 8 Streams.
2. Usando Java 8 Streams
Vamos começar com duas classes de entidade -Employee andDepartment:
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. Mais especificamente, queremos encontrar todos osEmployees de uma lista que:
-
ter "vendas" como seu departamento e
-
tem umemployeeId correspondente em uma lista deDepartments
E para conseguir isso, vamos filtrar um dentro do outro:
@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());
}
Depois de preencher ambas as listas, simplesmente passamos um Fluxo deEmployee objetos para o Fluxo de objetosDepartment.
Next, to filter records based on our two conditions, we’re using the anyMatch predicate, dentro do qual combinamos todas as condições fornecidas.
Finalmente, nóscollect o resultado emfilteredList.
3. Conclusão
Neste artigo, aprendemos como:
-
Transmita valores de uma lista para a outra lista usandoCollection#stream areia
-
Combine várias condições de filtro usando o spredicateanyMatch()
O código-fonte completo deste exemplo está disponívelover on GitHub.