簡體   English   中英

RxJava 2-減少concatMap中的隊列

[英]RxJava 2 - Reduce queue in 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);

現在,如果concatMap尚未使用這些元素(它們仍在隊列中),我想將其一次性對象修改為跳過otherSubject (3和4) otherSubject元素。

有可能實現這一目標嗎?

PS:不需要PublishSubject-只是為了簡單起見

您可以使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM