Java Project Reactor-查找是否使用DFS完成了所有子节点的处理

Java Project Reactor-查找是否使用DFS完成了所有子节点的处理,java,spring-boot,recursion,reactive-programming,project-reactor,Java,Spring Boot,Recursion,Reactive Programming,Project Reactor,我是新来的被动世界 我有下面的树结构,正在树上执行DFS,我想知道每个父节点的子节点处理何时完成 A -- AA -- AAA | -- AAB | -- AAC -- AB -- AC -- AD -- AE -- AEA -- AEB 在树上执行DFS(expandDeep)时,父节点上的doOnComplete在子节点完成之前发出 import lombok.Builder; import lombok.Data; import l

我是新来的被动世界

我有下面的树结构,正在树上执行DFS,我想知道每个父节点的子节点处理何时完成

A -- AA -- AAA
  |     -- AAB
  |     -- AAC
  -- AB
  -- AC
  -- AD
  -- AE -- AEA
        -- AEB
在树上执行DFS(expandDeep)时,父节点上的doOnComplete在子节点完成之前发出

import lombok.Builder;
import lombok.Data;
import lombok.Singular;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.List;

public class Main {

    public static void main(String[] args) {
        Config config = getConfig();
        Mono.just(config)
                .expandDeep(c -> Flux.fromIterable(c.getChildren()).doOnComplete(() -> System.out.println("Complete: " + c.getName())))
                .doOnComplete(() -> System.out.println("Processing complete... !!"))
                .map(s -> s.getName())
                .subscribe(System.out::println);
    }

    private static Config getConfig() {

        Config config = Config.builder().name("A")
                .child(Config.builder().name("AA")
                        .child(Config.builder().name("AAA").build())
                        .child(Config.builder().name("AAB").build())
                        .child(Config.builder().name("AAC").build())
                        .build())
                .child(Config.builder().name("AB").build())
                .child(Config.builder().name("AC").build())
                .child(Config.builder().name("AD").build())
                .child(Config.builder().name("AE")
                        .child(Config.builder().name("AEA").build())
                        .child(Config.builder().name("AEB").build())
                        .build())
                .build();
        return config;
    }

    @Builder
    @Data
    private static final class Config {

        private String name;

        @Singular("child")
        private List<Config> children;

    }

}
预期结果

A
AA
AAA
Complete: AAA
AAB
Complete: AAB
AAC
Complete: AAC
Complete: AA
AB
Complete: AB
AC
Complete: AC
AD
Complete: AD
AE
AEA
Complete: AEA
AEB
Complete: AEB
Complete: AE
Complete: A
Processing complete... !!

这是因为每个子处理实际上是独立的
Flux
,您将
doOnComplete
附加到它。因此,一旦父母中的一方吐出了最后一个孩子,即使这个孩子还没有被递归处理,这个父母也被认为已经完成了


doAfterTerminate
可能有帮助(它是在完成信号传播到下游后执行的)。

即使我尝试使用
doafterminate
,调用的顺序也是一样的。
A
AA
AAA
Complete: AAA
AAB
Complete: AAB
AAC
Complete: AAC
Complete: AA
AB
Complete: AB
AC
Complete: AC
AD
Complete: AD
AE
AEA
Complete: AEA
AEB
Complete: AEB
Complete: AE
Complete: A
Processing complete... !!