Flux.compose和Flux.transform之间的区别?

Kay*_*ayV 1 publisher publish-subscribe reactive-programming project-reactor reactive-streams

我正在学习反应流,并在Publishers(Flux)上工作,并致力于Flux的转型。为此,我得到了撰写和转换方法。

这是我的代码:

private static void composeStream() {
    System.out.println("*********Calling composeStream************");
    Function<Flux<String>, Flux<String>> alterMap = f -> {
                                                                return f.filter(color -> !color.equals("ram"))
                                                                        .map(String::toUpperCase);
                                                            };

    Flux<String> compose = Flux.fromIterable(Arrays.asList("ram", "sam", "kam", "dam"))
                                    .doOnNext(System.out::println)
                                    .compose(alterMap);

    compose.subscribe(d -> System.out.println("Subscriber to Composed AlterMap :"+d));
    System.out.println("-------------------------------------");

}

private static void transformStream() {
    System.out.println("*********Calling transformStream************");
    Function<Flux<String>, Flux<String>> alterMap = f -> f.filter(color -> !color.equals("ram"))
                                                            .map(String::toUpperCase);

    Flux.fromIterable(Arrays.asList("ram", "sam", "kam", "dam"))
            .doOnNext(System.out::println)
            .transform(alterMap)
            .subscribe(d -> System.out.println("Subscriber to Transformed AlterMap: "+d));
    System.out.println("-------------------------------------");
}
Run Code Online (Sandbox Code Playgroud)

这是输出,这两种情况都相同:

*********Calling transformStream************
ram
sam
Subscriber to Transformed AlterMap: SAM
kam
Subscriber to Transformed AlterMap: KAM
dam
Subscriber to Transformed AlterMap: DAM
-------------------------------------
*********Calling composeStream************
ram
sam
Subscriber to Composed AlterMap :SAM
kam
Subscriber to Composed AlterMap :KAM
dam
Subscriber to Composed AlterMap :DAM
-------------------------------------
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?请建议

Ole*_*uka 7

根据文档:

对其进行转换Flux以生成目标Flux。与Flux#compose(Function)提供的功能不同,提供的功能作为程序集的一部分执行。

这是什么意思?

如果我们像下面这样写一个小测试:

 int[] counter = new int[1];
 Function transformer  = f -> {
     counter[0]++;

     return f;
 }

 Flux flux = flux Flux.just("")
     .transform(transformer);

 System.out.println(counter[0]);

 flux.subscribe();
 flux.subscribe();
 flux.subscribe();
 System.out.println(counter[0]);
Run Code Online (Sandbox Code Playgroud)

在输出中,我们将观察到下一个结果:

 1
 1
Run Code Online (Sandbox Code Playgroud)

这意味着在管道装配过程中将一次执行变换功能,换句话说,将急切地执行变换功能。

反过来,.compose对于相同的代码,我们将获得下一个行为

 int[] counter = new int[1];
 Function transformer  = f -> {
     counter[0]++;

     return f;
 }

 Flux flux = flux Flux.just("")
     .compose(transformer);

 System.out.println(counter[0]);

 flux.subscribe();
 flux.subscribe();
 flux.subscribe();
 System.out.println(counter[0]);
Run Code Online (Sandbox Code Playgroud)

并输出

 0
 3
Run Code Online (Sandbox Code Playgroud)

这意味着对于每个订户转换函数将分别执行,并且我们可能认为这种执行是懒惰的