首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flux.compose与Flux.transform的差异?

Flux.compose与Flux.transform的差异?
EN

Stack Overflow用户
提问于 2018-01-03 10:46:02
回答 1查看 1.9K关注 0票数 1

我正在学习reactive和Publisher( Flux ),并致力于Flux的转换。为此,我得到了合成和转换方法。

这是我的代码:

代码语言:javascript
复制
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("-------------------------------------");
}

这是输出,对于这两种情况都是一样的:

代码语言:javascript
复制
*********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
-------------------------------------

这两者有什么区别呢?请建议

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-03 11:23:40

根据文件:

转换此Flux以生成目标Flux__。与Flux#compose(Function)__不同,提供的函数作为程序集的一部分执行。

这意味着什么?

如果我们将编写一个类似于next的小测试:

代码语言:javascript
复制
 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]);

在输出中,我们将观察到下一个结果:

代码语言:javascript
复制
 1
 1

这意味着转换函数将在管道组装过程中执行一次,换句话说,转换函数将被急切地执行

反过来,使用.compose,我们将获得相同代码的下一个行为

代码语言:javascript
复制
 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]);

和输出

代码语言:javascript
复制
 0
 3

这意味着,对于每个订阅者转换函数,将分别执行,我们可以将这种执行视为惰性

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48075824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档