Каков правильный способ замены вложенного цикла цикла потоками в 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()));
});
Это правильный/оптимальный способ сделать это? Или есть способ сделать это без второго вложенного потока?
Ответы
Ответ 1
Я бы, наверное, написал его вот так:
List<Long> deskIds = service.getAllNodesDepthFirst().stream()
.flatMap(p -> p.getDesks().stream())
.map(Desk::getId)
.collect(toList());