Java 8 Stream如何使用递归?

15

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

  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类拥有一个成员列表,该列表始终被初始化为空列表。我这里所做的是将成员的分层列表转换为平面列表。我理解这一部分。但我不明白的是递归在这里如何工作。

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


4
当你迭代完memberList中的所有项时,循环就会结束。 - Naghaveer R
2个回答

14

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

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


8
终止发生是因为对于那些没有子节点的“叶子节点”,
Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接