聊聊Flux的compose与flatMap操作

本文主要研究下Flux的compose与flatMap操作

compose

        Flux.just("1", "2","3")
                .log()
                .compose(stringFlux -> {
                    LOGGER.info("compose executed");
                    return stringFlux.map(e -> e + "$");
                }).subscribe(LOGGER::info);

输出如下:

20:59:15.692 [main] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging framework
20:59:15.702 [main] INFO com.example.demo.FluxTest - compose executed
20:59:15.707 [main] INFO reactor.Flux.Array.1 - | onSubscribe([Synchronous Fuseable] FluxArray.ArraySubscription)
20:59:15.709 [main] INFO reactor.Flux.Array.1 - | request(unbounded)
20:59:15.709 [main] INFO reactor.Flux.Array.1 - | onNext(1)
20:59:15.709 [main] INFO com.example.demo.FluxTest - 1$
20:59:15.710 [main] INFO reactor.Flux.Array.1 - | onNext(2)
20:59:15.710 [main] INFO com.example.demo.FluxTest - 2$
20:59:15.710 [main] INFO reactor.Flux.Array.1 - | onNext(3)
20:59:15.710 [main] INFO com.example.demo.FluxTest - 3$
20:59:15.710 [main] INFO reactor.Flux.Array.1 - | onComplete()

可以看到compose executed只打印一次

flatMap

        Flux.just("1","2","3")
                .log()
                .flatMap(s -> {
                    LOGGER.info("flatMap executed");
                    return Flux.just(s+"$");
                }).subscribe(LOGGER::info);

输出如下:

21:00:54.497 [main] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging framework
21:00:54.516 [main] INFO reactor.Flux.Array.1 - | onSubscribe([Synchronous Fuseable] FluxArray.ArraySubscription)
21:00:54.519 [main] INFO reactor.Flux.Array.1 - | request(256)
21:00:54.520 [main] INFO reactor.Flux.Array.1 - | onNext(1)
21:00:54.520 [main] INFO com.example.demo.FluxTest - flatMap executed
21:00:54.520 [main] INFO com.example.demo.FluxTest - 1$
21:00:54.520 [main] INFO reactor.Flux.Array.1 - | onNext(2)
21:00:54.520 [main] INFO com.example.demo.FluxTest - flatMap executed
21:00:54.520 [main] INFO com.example.demo.FluxTest - 2$
21:00:54.520 [main] INFO reactor.Flux.Array.1 - | onNext(3)
21:00:54.520 [main] INFO com.example.demo.FluxTest - flatMap executed
21:00:54.520 [main] INFO com.example.demo.FluxTest - 3$
21:00:54.521 [main] INFO reactor.Flux.Array.1 - | onComplete()

可以看到flatMap executed在每次onNext的时候都打印一次

小结

compose操作是将整个flux作为一个整体输入一次性转换,而flatMap是针对flux的每个item作为输入来进行转换。

doc

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard...
    占导zqq阅读 9,205评论 6 151
  • 最近项目里面有用到Rxjava框架,感觉很强大的巨作,所以在网上搜了很多相关文章,发现一片文章很不错,今天把这篇文...
    Scus阅读 6,907评论 2 50
  • 我从去年开始使用 RxJava ,到现在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的...
    Jason_andy阅读 5,602评论 7 62
  • 真有来世,娶你!
    沐师兄阅读 380评论 1 0
  • 那个人 那个人,是个爱照片,爱看新闻,有些执拗但十分可爱的老顽童。 那个人,我叫他爷爷。 ...
    麦吉可先森阅读 301评论 0 0