RxJava 2 - 减少concatMap中的队列

时间:2017-12-13 14:26:59

标签: java android queue rx-java2 concatmap

我有一个主题可以发出一些数据。然后我想修改队列中的这些数据(长操作)。但是当另一个主题发出其他东西时我想减少我的队列

    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 - 它只是为了简单起见而使用

1 个答案:

答案 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);