最近,我决定用projectreactor.io(io.projectreactor:3.1.1)尝试第5版。
有谁知道使用此功能的最佳情况是什么?使用它们以及应该在哪里使用它们有什么缺点和优点?
好的例子会有所帮助。
答案 0 :(得分:15)
这里有两种截然不同的运营商类别:
Flux
本身transform
和compose
用于代码互用当您定期组合运营商链并且您的应用程序中有常见的运营商使用模式时,您可以使用compose
和transform
来共享此代码或为其提供更具描述性的名称。
当应用了共同运算符时,两者之间的区别是:transform
在实例化时应用它们,而compose
在订阅时应用它们(允许动态选择添加运营商)。
查看reference documentation了解更多详情和示例。
as
这是一个方便的快捷方式,可以将Function
应用于整个Flux
,同时保持整个代码的流畅风格。一个例子是转换为Mono
(如javadoc中所示),但它也可以帮助以工厂方法样式实现的外部运算符。
以reactor-addons
MathFlux
为例,并比较:
MathFlux.sumInt(Flux.range(1, 10)
.map(i -> i + 2)
.map(i -> i * 10))
.map(isum -> "sum=" + isum);
要:
Flux.range(1, 10)
.map(i -> i + 2)
.map(i -> i * 10)
.as(MathFlux::sumInt)
.map(isum -> "sum=" + isum)
(这可以帮助您处理这样一个事实:与Kotlin不同,Java没有扩展方法:))
Flux
map
就是数据。它将1-1转换函数应用于源中的每个元素,因为它们可用。
在上面的MathFlux示例中,map
连续用于向每个原始整数添加2,然后再次将序列中的每个数字乘以10,然后在结束时第三次生成{{1}每个总和中都有。
答案 1 :(得分:2)
我发现reference documentation中的示例很难理解
因此,让以下程序围绕转换与撰写概念进行了解决。
fnstatefull = flux -> {
Flux<String> f = flux.filter(color -> {
//only reds are allowed
return color.equalsIgnoreCase("red");
});
//applies mapping 'toUpperCase' based on the external control 'toUpper'
if(toUpper) {
f= f.map(String::toUpperCase);
}
return f;
};
<强>变换强>
在通量实例化时应用运算符。
对于以下两个订阅者,fnstatefull的行为方式相同。
Flux<String> f = Flux.just("red", "green", "blue");
toUpper = false;
f = f.transform(fnstatefull);
toUpper = true;
f.subscribe(op -> log.error("ONE>>>" + op));
toUpper = false;
f.subscribe(op -> log.error("TWO>>>" + op));
输出
ReactordemoApplication - ONE>>>red
ReactordemoApplication - TWO>>>red
<强>撰写强>
操作员在订阅时应用于助焊剂。
fnstatefull对于以下每个订阅者的行为都不同。
Flux<String> f = Flux.just("red", "green", "blue");
toUpper = false;
f = f.compose(fnstatefull);
toUpper = true;
f.subscribe(op -> log.error("ONE>>>" + op));
toUpper = false;
f.subscribe(op -> log.error("TWO>>>" + op));
输出
ReactordemoApplication - ONE>>>RED
ReactordemoApplication - TWO>>>red