我有Employee
个列表,每个员工中都有一个Department
列表,每个部门都有一个location
列表,我想获取基于位置的列表在某些过滤条件下。
这是我的代码-
for (Employee empl : employeeList) {
if(empl.getEmployeeName().equals("XXX")) {
for (Department dept : empl.getDepartmets()) {
if(dept.getDepartmentName().equals("Sales")) {
return dept.getLocations();
}
}
}
}
我想在java8 Steam api上处理此问题,有人可以帮忙吗?
答案 0 :(得分:3)
employeeList.stream()
.filter(x -> "XXX".equals(x.getEmployeeName()))
.flatMap(x -> x.getDepartmets().stream().filter(y -> "Sales".equals(y.getDepartmentName())))
.findFirst()
.map(Department::getLocations)
.orElse(Collections.emptyList());
唯一的一点是,flatMap
直到真正java-10才真正变得懒惰,如果您真的在乎,并且我假设 locations
是{{1 }}。
答案 1 :(得分:1)
Stream<Employee>
创建一个employeeList
filter
此信息流仅保留姓名为“ XXX”的员工Stream<Employee>
映射/展平为Stream<Department>
"Sales"
的项目findFirst
Department::getLocations
,然后您可以通过调用orElse
获得Optional包含的值,以提供默认值或ifPresent
或在您的用例中足够的值。代码:
employeeList.stream() // step 1
.filter(e -> e.getEmployeeName().equals("XXX")) // step 2
.flatMap(e -> e.getDepartmets().stream()) // step 3
.filter(d -> "Sales".equals(d.getDepartmentName())) // step 4
.findFirst() // step 5
.map(Department::getLocations); // step 6