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)
两者有什么区别?请建议
对其进行转换
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)
这意味着对于每个订户转换函数将分别执行,并且我们可能认为这种执行是懒惰的
归档时间: |
|
查看次数: |
774 次 |
最近记录: |