使用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