【问题标题】:What is the proper way of replacing a nested for loop with streams in Java 8?在 Java 8 中用流替换嵌套 for 循环的正确方法是什么?
【发布时间】:2014-11-27 16:03:45
【问题描述】:

在学习 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”对象的列表属性,并将“Id”字段提取到列表中。

我使用流想出了以下代码:

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

这是正确/最佳的方法吗?或者有没有办法在没有第二个嵌套流的情况下做到这一点?

【问题讨论】:

  • 我觉得没问题。你的方法没有问题。
  • 欲了解更多信息,请查看此链接:oracle.com/technetwork/articles/java/…
  • @Prakhar:是的,我的方法奏效了,但它有点幼稚,我认为应该有某种方法来简化它,就像 assylias 所展示的那样。

标签: java java-8 java-stream


【解决方案1】:

我可能会这样写:

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

【讨论】:

  • 是的,我希望有类似“flatMap”的东西!
  • @assylias 我查看了 groupingBy 但似乎我可以得到 Map> 但我不希望那样,我希望得到 Map 。你能建议我能不能得到那个吗?
  • 针对您的具体情况提出单独的问题是有意义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-05
  • 2015-08-03
  • 2017-04-02
  • 2020-10-04
  • 1970-01-01
相关资源
最近更新 更多