RxJava 2:为什么PublishProcessor不能订阅Observable?

时间:2019-04-23 09:52:19

标签: java rx-java reactive-programming rx-java2 stream-processing

我想在RxJava中实现相当简单的DAG。

我们有一个物品来源:

Observable<String> itemsObservable = Observable.fromIterable(items)

接下来,我想有一个处理器可以订阅itemsObservable,并使多个订阅者可以订阅它。

所以我创建了:
PublishProcessor<String> itemsProccessor = PublishProcessor.create();

不幸的是,这不可能:
itemsObservable.subscribe(itemsProccessor);

为什么?实现这种DAG的合适API是什么?

以下是演示图:

enter image description here

这是我(失败的)尝试实施这种DAG的尝试:

List<String> items = Arrays.asList("a", "b", "c");
Flowable<String> source = Flowable.fromIterable(items);

PublishProcessor<String> processor = PublishProcessor.create();
processor.doOnNext(s -> s.toUpperCase());

processor.subscribe(System.out::println);
processor.subscribe(System.out::println);
source.subscribe(processor); 

1 个答案:

答案 0 :(得分:3)

这是因为PublishProcessor实现了Subscriber,而Observable的订阅方法却接受了Observer。您可以将itemsObservable转换为Flowable,它将完成工作。

    Observable<String> items = Observable.fromIterable(Arrays.asList("a","b"));
    PublishProcessor<String> processor = PublishProcessor.create();
    items.toFlowable(BackpressureStrategy.BUFFER)
            .subscribe(processor);