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

时间:2014-11-27 16:03:46

标签: java java-8 java-stream

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:29)

我可能会这样写:

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