我继续玩Reactor,现在我看到invalid mount config for type "bind": bind source path does not exist
运算符的行为与compose
完全相同,我想知道是否有任何我不理解的差异。
flatMap
这两个例子表现并返回相同的结果。
问候。
答案 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()
有很多用途,但这不是其中之一。