Извлекайте данные из многоуровневого внутреннего списка, используя поток java8 - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть список 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();
            }
        }
    }
}

Я хочу справиться с этим на Java API Steam, кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018
  1. Создайте Stream<Employee> из employeeList
  2. filter этого потока, чтобы сохранить только тех сотрудников, чье имя "XXX"
  3. , отобразить / выровнять Stream<Employee> в Stream<Department>
  4. отфильтровать этот список отделов, чтобы сохранить элемент, название отдела которого равно "Sales"
  5. , чтобы найти соответствующий элемент с findFirst
  6. сопоставьте с Department::getLocations, которое затем вы можете получить значение, которое необязательный параметр содержит в вызовах orElse, предоставляющих значение по умолчанию или 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
0 голосов
/ 11 декабря 2018
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 является List какого-то типа здесь.

...