Как работает рекурсия в потоке Java 8? - PullRequest
0 голосов
/ 03 января 2019

У меня есть такой метод, где я использую рекурсию с потоками:

  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 имеет дочерний список членов, который всегда инициализируется пустым списком. Здесь я делаю преобразование иерархического списка членов в плоский список. Я понимаю эту часть. Я не понимаю, как здесь работает рекурсия.

В рекурсии она прекращается, когда выполняются определенные условия. Но здесь я не даю никаких условий для прекращения намеренно. Так как же здесь работает завершающая часть?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Прекращение происходит потому, что для "листьев", у которых нет детей,

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

вызовет convertToFlatList в пустом списке, а применение flatMap() в пустом потоке не вызовет операцию отображения.

0 голосов
/ 03 января 2019

Рекурсия заканчивается, когда memberList будет пустым, поскольку в этом случае будет возвращено пустое List.

, т. Е. Когда i.getChildren() является пустым List, рекурсивный вызов convertToFlatList(i.getChildren()) получит пустой List, поэтому конвейер Stream не сделает еще один рекурсивный вызов (так как не имеет элементов для выполнения flatMap on) и вернет пустой List.

...