我扩展了AbstractOnSubscribe
以创建我自己的OnSubscribe
,以便与我Observable.create(OnSubscribe<T>)
InputStream
一起使用,该onNext
基本上读取InputStream
并调用{{1}对于每一行。
问题是,我还需要将Observable
作为其他Observable<InputStream> isObservable = ...;
isObservable
.flatMap(is -> Observable.create(new OnSubscribeInputStreamToLines(is)));
的一部分。
简单的解决方案是执行以下操作:
Observable.lift
事情是,它不会真正有效,因为它会为每个inputStream创建一个Observable。我以为我可以使用OnSubscribeInputStreamToLines
来完成此任务。
有没有办法可以轻松将Operator
转换为onNext
?
我主要担心背压问题,因为我会为InputStream
的每一行拨打AbstractOnSubscribe
,虽然AbstractOperator
支持背压,但我找不到{{1}这也是一样的。
由于
答案 0 :(得分:1)
这里的区别在于,OnSubscribeInputStreamToLines
是进入Observable世界的入口点,而lift
是现有序列的中间运算符。此外,整个吞吐量可能由InputStream
后面的IO操作或操作中的字符串处理所主导,所以我不会担心这个瘦包装器。
AbstractOnSubscribe
捕获运算符的生成器方面,帮助您构建背压感知值发射器(通常是冷源),您可以在其中草拟出发射的方式,时间和值。
AbstractOperator
不能以这种方式推广,因为Operator
有更多的自由来与上游值和下游请求进行交互。它们针对特定任务进行了高度定制,并且对它们几乎没有共同点。它们可以用一组原语构建,但就是这样(我写了数百个)。
所以不要害怕flatMap
ping事情。
答案 1 :(得分:1)
不要为每个lift
创建另一个Observable而烦恼。与InputStream
相关的开销相比,开销可能没有您想象的那么大。
我不知道您正在消费的Observable.using()
的性质,但您应该考虑Operator
安全地关闭这些资源(终止或取消订阅时)。
你对写一个支持Operator
的背压犹豫不决是绝对正确的。除非你正在编写现有的map()
,否则踩踏是非常棘手的。