使用Java8流从多级内部列表中检索数据

时间:2018-12-11 12:10:07

标签: java java-8 java-stream

我有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上处理此问题,有人可以帮忙吗?

2 个答案:

答案 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直到真正才真正变得懒惰,如果您真的在乎,并且我假设 locations是{{1 }}。

答案 1 :(得分:1)

  1. Stream<Employee>创建一个employeeList
  2. filter此信息流仅保留姓名为“ XXX”的员工
  3. Stream<Employee>映射/展平为Stream<Department>
  4. 过滤此部门列表以保留部门名称等于"Sales"的项目
  5. 使用findFirst
  6. 获取查找匹配项
  7. 映射到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