最近,我决定用projectreactor.io (io.projectreactor:3.1.1)尝试 spring 5 。
有谁知道使用此功能的最佳情况是什么?使用它们各自的优缺点以及应该在哪里使用它们?
好的例子会有所帮助。
最近,我决定用projectreactor.io (io.projectreactor:3.1.1)尝试 spring 5 。
有谁知道使用此功能的最佳情况是什么?使用它们各自的优缺点以及应该在哪里使用它们?
好的例子会有所帮助。
您在这里有两种截然不同的运算符类别:
Flux
自己工作的运算符transform
并且transformDeferred
用于代码互化当您定期编写运算符链并且在应用程序中具有常见的运算符使用模式时,您可以将此代码相互化或使用transform
and给它一个更具描述性的名称transformDeferred
。
两者之间的区别在于应用互化运算符时:在transform
实例化时transformDeferred
应用它们,而在订阅时应用它们(允许动态选择添加的运算符)。
查看参考文档以获取更多详细信息和示例。
注意:在 3.3.0 之前的版本transformDeferred
中调用compose
as
这是一个方便的快捷方式,可以将 aFunction
应用于整体Flux
,同时保持整个代码的流畅风格。
与运算符的主要区别transform*
在于它不强制执行特定的返回类型。它全部由Function
您使用的驱动,例如可以用于以StepVerifier
流利的风格进行测试:
Flux.just("test")
.map(String::length)
.as(StepVerifier::create)
//from there on we're dealing with the StepVerifier API
.expectNext(4)
.verifyComplete();
javadoc 中显示的示例使用这种方法转换为Mono
using Mono::from
,这有点令人困惑,因为返回类型非常接近Flux
.
请注意,这种方法还可以帮助以工厂方法样式实现的外部运算符来“扩展” Flux
API
举个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,最后第三次String
从每个和中产生一个。
我发现参考文档中的示例 很难理解
因此,制作了以下程序来围绕转换与组合的概念。
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