先看代码:
/**
* 遍历进行中服务 拿到指定的insEmp
* 创建人: xxx
* 创建时间: 2023/04/12
*/
private InstoreServiceEmp getInsEmp(InstoreService ins ,int insEmpId){
if(ins!=null && !CollectionUtils.isEmpty(ins.getServer())){
for (InstoreServiceServer server: ins.getServer()) {
if(!CollectionUtils.isEmpty(server.getInsEmps())){
for (InstoreServiceEmp emp:server.getInsEmps()) {
if(emp.getId().intValue() == insEmpId){
return emp;
}
}
}
if(!CollectionUtils.isEmpty(server.getInsItems())){
for (InstoreServiceItem item:server.getInsItems()) {
if(!CollectionUtils.isEmpty(item.getRecomEmps())){
for (InstoreServiceEmp emp:item.getRecomEmps()) {
if(emp.getId().intValue() == insEmpId){
return emp;
}
}
}
}
}
}
}
return null;
}
项目中看到这种代码,让我实在是难受,看了下层级结果
ins 下包含 List server,
server 下包含 List insItems 和 List insEmps,
而 下包含 List recomEmps
用 stream 流和optional 优化后的代码:
private Optional<InstoreServiceEmp> getInsEmp(InstoreService ins, int insEmpId) {
if (ins == null || CollectionUtils.isEmpty(ins.getServer())) {
return Optional.empty();
}
return ins.getServer().stream()
.flatMap(server -> Stream.concat(server.getInsEmps().stream(), server.getInsItems().stream()
.flatMap(item -> item.getRecomEmps().stream())))
.filter(emp -> emp.getId() == insEmpId)
.findFirst();
}
简洁多了,舒服了。