当前位置: 首页 > 面试题库 >

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

祖浩淼
2023-03-14
问题内容

在学习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”字段提取到列表中。

我想出了以下使用stream的代码:

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

这是正确/最佳的方式吗?还是有没有第二个嵌套流的方法来执行此操作?


问题答案:

我可能会这样写:

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


 类似资料:
  • 在学习Java 8 streams和lambas时,我尝试用streams替换以下嵌套for循环: 循环迭代“ProvidedService”对象的列表,对于每个对象,循环遍历“Desk”对象的列表属性,并将“Id”字段提取到列表中。 我使用streams生成了以下代码: 这是正确/最佳的方法吗?或者有没有一种方法可以在没有第二个嵌套流的情况下实现这一点?

  • 问题内容: 我正在使用multiprocessor.Pool()模块来加速“令人尴尬的并行”循环。其实我有一个嵌套的循环,现在用multiprocessor.Pool加快内循环。例如,在不并行化循环的情况下,我的代码如下: 使用并行化: 我的主要问题是这是否正确,我应该在循环内包含multiprocessing.Pool(),或者是否应该在循环外创建池,即: 另外,我不知道我是否应该包括线“poo

  • 我正在寻找一种用函数式编程方法替换嵌套foreach循环的方法。情况是这样的: 目前我的代码是这样的: 这将生成如下所示的输出: 有谁知道如何用函数式编程替代方案替换foreach代码块?

  • 我有以下片段,我想知道是否可以用Java-Streams/Java8 API替换它,以及如何替换它

  • 在Java8中,用流替换嵌套的for循环的正确方法是什么? 好的,我正在构建一个服务,它使用另一个服务,这个服务提供了一个我无法控制的类。我必须在类出现时使用它,因为它是在每次构建项目时从文件动态生成的。它是一个完全混乱的嵌套类和嵌套列表吨。命名约定也是一团糟,但为了可读性,我在这里做了很多清理。我需要深入挖掘列表,从一个对象(下层)获得两个值(code和cgyCode)并使用一个作为键(code

  • 在Haskell中执行嵌套循环有两种明显的“惯用”方法:使用列表monad或使用 : 在1s内运行。这个库使用得不多,也远不是惯用的,那么,获得快速恒定空间二维计算的惯用方法是什么呢?(注意,这不是REPA的情况,因为我想在网格上执行任意IO操作。)