[英]How does recursion work with Java 8 Stream?
我有一個這樣的方法,我在流中使用遞歸:
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
為空時,遞歸將結束,因為在這種情況下將返回一個空的List
。
例如,當i.getChildren()
是一個空List
,遞歸調用convertToFlatList(i.getChildren())
將收到一個空List
,因此Stream
管道不會再進行一次遞歸調用(因為它沒有任何元素可以在上執行flatMap
),並返回一個空的List
。
之所以終止,是因為對於沒有孩子的“葉子”,
Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())
將在一個空列表上調用convertToFlatList
,並且在空流上應用flatMap()
不會調用該映射操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.