【问题标题】:How does recursion work with Java 8 Stream?递归如何与 Java 8 Stream 一起工作?
【发布时间】:2019-10-20 16:07:27
【问题描述】:

我有一个这样的方法,我在 Streams 中使用递归:

  private static List<Member> convertToFlatList(List<Member> memberList)
  {
    return memberList.stream().flatMap(i -> Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())).collect(Collectors.toList());
  }

假设Member 类有一个子成员列表,该列表始终初始化为一个空列表。在这里,我正在做的是将成员的分层列表转换为平面列表。我理解那部分。我不明白的是这里的递归是如何工作的。

在递归中,它在满足某些条件时终止。但在这里我没有给出任何有意终止的条件。那么终止部分在这里是如何工作的呢?

【问题讨论】:

  • 遍历 memberList 中的所有项目后结束。

标签: java recursion java-8 java-stream


【解决方案1】:

memberList 为空时递归将结束,因为在这种情况下将返回一个空的List

即当i.getChildren() 是一个空的List 时,递归调用convertToFlatList(i.getChildren()) 将收到一个空的List,因此Stream 管道不会进行另一个递归调用(因为它没有要执行的元素flatMap on ),并将返回一个空的List

【讨论】:

    【解决方案2】:

    终止的发生是因为对于没有任何孩子的“叶子”,

    Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())
    

    将对空列表调用convertToFlatList,对空流应用flatMap()不会调用映射操作。

    【讨论】:

      猜你喜欢
      • 2014-06-15
      • 2016-03-06
      • 2023-02-20
      • 2014-05-08
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多