Java Project Reactor-查找是否使用DFS完成了所有子节点的处理
我是新来的被动世界 我有下面的树结构,正在树上执行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
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... !!