Подтвердить что ты не робот

Каков правильный способ замены вложенного цикла цикла потоками в Java 8?

Во время обучения Java 8 потокам и lambas я попытался заменить следующие вложенные для циклов потоки:

List<Long> deskIds = new ArrayList<>();
for(ProvidedService memberService : service.getAllNodesDepthFirst()){
   for(Desk d : memberService.getDesks()){
     deskIds.add(d.getId());
   }
}

Цикл выполняет итерацию списка объектов "ProvidedService" и для каждого из них выполняет итерацию над свойством списка объектов "Desk" и извлекает поле "Id" в список.

Я придумал следующий код, используя потоки:

List<Long> deskIds = new ArrayList<>();
service.getAllNodesDepthFirst().stream().forEach(srv -> {
    deskIds.addAll(srv.getDesks().stream().map(Desk::getId).collect(Collectors.toList()));
});

Это правильный/оптимальный способ сделать это? Или есть способ сделать это без второго вложенного потока?

4b9b3361

Ответ 1

Я бы, наверное, написал его вот так:

List<Long> deskIds = service.getAllNodesDepthFirst().stream()
                                          .flatMap(p -> p.getDesks().stream())
                                          .map(Desk::getId)
                                          .collect(toList());