我有一个主题可以发出一些数据。然后我想修改队列中的这些数据(长操作)。但是当另一个主题发出其他东西时我想减少我的队列
PublishSubject<Integer> myBaseSubject = PublishSubject.create();
PublishSubject<Integer> otherSubject = PublishSubject.create();
myBaseSubject
.concatMap(integer -> Observable.timer(5, TimeUnit.SECONDS) // long operation
.map(aLong -> integer)
)
.subscribe(
integer -> Log.i(TAG, "result: " + integer),
Functions.emptyConsumer()
);
myBaseSubject.onNext(1);
myBaseSubject.onNext(2);
myBaseSubject.onNext(3);
myBaseSubject.onNext(4);
myBaseSubject.onNext(5);
otherSubject.onNext(3);
otherSubject.onNext(4);
myBaseSubject.onNext(6);
myBaseSubject.onNext(7);
现在我想修改我的一次性以跳过由otherSubject
(3和4)发出的元素,如果concatMap
尚未使用这些元素(它们仍在队列中)。
有可能实现这一目标吗?
PS:不需要PublishSubject - 它只是为了简单起见而使用
答案 0 :(得分:0)
您可以ConcurrentHashMap
跟踪concatMap
不应处理哪些元素。我假设在创建该项目的索引之后决定不处理项目。
ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();
myBaseSubject
.doOnNext(v -> map.put(v, v))
.concatMap(integer -> {
if (map.remove(integer) != null) {
return Observable.timer(5, TimeUnit.SECONDS) // long operation
.map(aLong -> integer)
}
return Observable.empty();
})
.subscribe(
integer -> Log.i(TAG, "result: " + integer),
Functions.emptyConsumer()
);
myBaseSubject.onNext(1);
myBaseSubject.onNext(2);
myBaseSubject.onNext(3);
myBaseSubject.onNext(4);
myBaseSubject.onNext(5);
map.remove(3);
map.remove(4);
myBaseSubject.onNext(6);
myBaseSubject.onNext(7);