使用java8流从多级内部列表检索数据
我有使用java8流从多级内部列表检索数据,java,java-8,java-stream,java-10,Java,Java 8,Java Stream,Java 10,我有员工列表s,每个员工都有部门列表s,每个部门都有位置列表,我想根据一些过滤条件获取位置列表 这是我的密码- for (Employee empl : employeeList) { if(empl.getEmployeeName().equals("XXX")) { for (Department dept : empl.getDepartmets()) { if(dept.getDepartmentName().equals("Sales")
员工列表
s,每个员工都有部门列表
s,每个部门都有位置列表
,我想根据一些过滤条件获取位置列表
这是我的密码-
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上处理这个问题,有人能帮忙吗
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
并不是真正的懒惰,除非你真的关心这个问题,我假设locations
是某种类型的列表
从员工列表创建流
filter
此流仅保留姓名为“XXX”的员工
将流
映射/展平为流
筛选此部门列表以保留部门名称等于“销售”的项目
使用findFirst
映射到Department::getLocations
,然后通过调用orElse
提供默认值或ifPresent
或在您的用例中足够的任何内容,可以获取可选项包含的值
代码:
到目前为止,您尝试了什么?我使用out-stream API对逻辑进行了编码,我希望在java8 stream中处理此逻辑它应该是“Sales”.equals(d.getDepartmentName()
?@Aomine,这不是对以前代码的直接移植,直到java-10
当flatMap
变得懒惰…@Eugene不要让初学者感到不安,代码已经足够了,不管实现是否懒惰。@manfromwhere,正如Eugene OP所说,在我回答后更改了它。我现在编辑了它。谢谢帮助。只需少量调整即可工作,列表位置=employeeList.stream().filter(e->e.getEmployeeName().equals(“Arun”)).flatMap(e->e.GetDepartments().stream()).filter(d->“Marketing”).equals(d.getDepartmentName()).findFirst().map(Department::getLocations.).orElse(null);是否返回列表,为我获取错误列表位置=employeeList.stream().filter(x->“XXX”.equals(x.getEmployeeName()).flatMap(x->x.GetDepartments().stream().filter(y->“Sales”.equals(y.getDepartmentName())).findFirst().orElse(null)@aruntheimperfect您没有收到列表。findFirst将返回部门object@Eugene对不起,我不是指你的代码。检查aruncomment@aruntheimperfect你错过了一张地图(Department::getLocations)
@aruntheimperfect如果有帮助的话,你可以找到答案
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