在Java 8中用流替换嵌套for循环的正确方法是什么?

在学习Java 8流和lambas时,我尝试用流替换以下嵌套for循环:

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

循环迭代一个’ProvidedService’对象列表,并为每个对象迭代’Desk’对象的list属性,并将’Id’字段提取到列表中。

我使用流来提出以下代码:

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

这是正确/最佳的方式吗? 或者有没有办法在没有第二个嵌套流的情况下执行此操作?

我可能会这样写:

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