在Flux和Mono中compose()与transform()vs. as()vs. map()

时间:2017-11-17 10:39:27

标签: reactive-programming project-reactor reactive-streams

最近,我决定用projectreactor.io(io.projectreactor:3.1.1)尝试第5版。

有谁知道使用此功能的最佳情况是什么?使用它们以及应该在哪里使用它们有什么缺点和优点?

好的例子会有所帮助。

2 个答案:

答案 0 :(得分:15)

这里有两种截然不同的运营商类别:

处理Flux本身

的运算符

transformcompose用于代码互用

当您定期组合运营商链并且您的应用程序中有常见的运营商使用模式时,您可以使用composetransform来共享此代码或为其提供更具描述性的名称。

当应用了共同运算符时,两者之间的区别是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