Reactor compose vs flatMap

时间:2018-01-28 10:21:51

标签: java spring project-reactor

我继续玩Reactor,现在我看到invalid mount config for type "bind": bind source path does not exist运算符的行为与compose完全相同,我想知道是否有任何我不理解的差异。

flatMap

这两个例子表现并返回相同的结果。

问候。

2 个答案:

答案 0 :(得分:5)

来自@Andrew的解释非常好。只想添加一个例子以便更好地理解。

Flux.just("1", "2")
        .compose( stringFlux -> {
            System.out.println("In compose"); // It takes whe whole Flux as input
           return stringFlux.collectList();
        }).subscribe(System.out::println);


Flux.just("1", "2").flatMap(s -> { //Input to the anonymous function is individual items in stream
            System.out.println("In flatMap");
            return Flux.just(Integer.parseInt(s));
        }).subscribe(System.out::println);

这会产生输出

In compose
[1, 2]
In flatMap
1
In flatMap
2

表示compose适用于整个流,但flatMap适用于流中的各个项目

答案 1 :(得分:4)

An excellent explanation by Dan Lew

不同之处在于compose()是更高级别的抽象:它在整个流上运行,而不是单独发出的项目。更具体地说:

  • compose()是从流中获取原始Observable<T>的唯一方法。因此,影响整个流的运营商(如subscribeOn()observeOn())需要使用compose()

    相反,如果您将subscribeOn() / observeOn()放入flatMap(),则只会影响您在Observable中创建的flatMap(),而不会影响其他流。

  • 创建compose()流时,
  • Observable会立即执行,就像您已将内联运算符编写一样。 flatMap()在每次调用onNext()时都会执行。换句话说,flatMap()转换每个项目,而compose()转换整个流。

  • flatMap()效率低下,因为每次调用Observable时都必须创建新的onNext()compose()按原样在流上运行。如果要使用可重用代码替换某些运算符,请使用compose()flatMap()有很多用途,但这不是其中之一。