这里有两种截然不同的运算符:
从事以下工作的运营商Flux
itself
transform
and transformDeferred
用于代码交互
当您定期编写运算符链并且应用程序中具有常见的运算符使用模式时,您可以使用此代码互用或为其指定更具描述性的名称transform
and transformDeferred
.
两者的区别在于when应用互化运算符:transform
在实例化时应用它们,同时transformDeferred
在订阅时应用它们(允许动态选择添加的运算符)。
看看参考文档 http://projectreactor.io/docs/core/release/reference/docs/index.html#advanced-mutualizing-operator-usage了解更多详细信息和示例。
note: transformDeferred
被称为compose
3.3.0之前的版本
as
这是应用一个方便的快捷方式Function
对整体Flux
同时保持整个代码的流畅风格。
The 主要区别在于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
Take reactor-addons
MathFlux
例如,并比较:
MathFlux.sumInt(Flux.range(1, 10)
.map(i -> i + 2)
.map(i -> i * 10))
.map(isum -> "sum=" + isum);
To:
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
从每笔金额中。