递归如何与 Java 8 Stream 配合使用?

2022-09-03 13:28:35

我有一个这样的方法,我将递归与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

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


答案 1

递归将在为空时结束,因为在这种情况下将返回空。memberListList

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


答案 2

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

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

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


推荐