第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何獲取 Flux 的最后一項(xiàng)而不用 reduce() 或 last() 折疊它

如何獲取 Flux 的最后一項(xiàng)而不用 reduce() 或 last() 折疊它

BIG陽(yáng) 2024-01-28 16:08:17
如何獲取 Flux 的最后一項(xiàng)而不用 reduce() 或 last() 折疊它?這是我的用例:1)我有Flux<T>根據(jù)狀態(tài)生成的生成器。2)當(dāng)內(nèi)部Flux完成時(shí),它會(huì)改變影響我在生成器中發(fā)出的下一個(gè)對(duì)象的狀態(tài)Flux。示意性地看起來(lái)像這樣static class State {    int secret = 2;    int iteration = 0;}Random rand = new Random(1024);Flux<Integer> stream = Flux.<Flux<Integer>, State>generate(State::new, (state, sink) -> {    System.out.println(String.format("Generate: %d", state.secret));    Flux<Integer> inner = Flux.range(1, rand.nextInt(10));    sink.next(inner.doOnComplete(() -> {        // How do I get last item of `inner` here ?        // For example I'd like to decrement `state.secret` by last value of `inner`    }));    return state;}).flatMap(Function.identity());UPD:我沒有標(biāo)記我的答案,因?yàn)楹诳捅蛔C明是不可靠的。有可能.generate()在前一個(gè)被完全消耗之前被調(diào)用Flux,因此使得值last不正確。
查看完整描述

1 回答

?
幕布斯6054654

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超7個(gè)贊

第一個(gè)版本不可靠。我又黑了一個(gè):


static <T> Flux<T> expandOnLastItem(Supplier<Flux<T>> seed, Function<T, Flux<T>> generator) {

    return Flux.just(new AtomicReference<T>())

            .flatMap(last -> Flux.just(seed.get().materialize())

                    .flatMap(Function.identity())

                    .expand(v -> {

                        if (v.hasValue()) {

                            last.set(v.get());

                        } else if (v.isOnComplete() && last.get() != null) {

                            Flux<T> res = generator.apply(last.get());

                            last.set(null);

                            return res.materialize();

                        }

                        return Flux.empty();

                    })

                    .filter(s -> !s.isOnComplete())

                    .dematerialize());

}

可以用作


static Flux<Integer> getPage(int pageId, int size) {

    return Flux.defer(() -> {

        if (pageId < 3) {

            System.out.println("Returning data for pageId: " + pageId);

            return Flux.range(pageId * 100, size);

        } else {

            System.out.println("Returning empty for pageId: " + pageId);

            return Flux.empty();

        }

    });

}


expandOnLastItem(

        () -> getPage(0, 5),

        lastId -> {

            System.out.println("  Expanding. Last item: " + lastId);

            int curPage = lastId / 100;

            return getPage(curPage + 1, 5);

        })

        .reduce(0L, (count, value) -> {

            System.out.println("==> " + value);

            return count + 1;

        })

        .block();

所以我通過(guò)改變生成器中的狀態(tài)變量來(lái)破解它。它可以工作,但功能不是很好。如果其他人可以提出替代方案,我將不勝感激。


Random rand = new Random(1024);

Flux.<Flux<String>, State>generate(State::new, (state, sink) -> {


    if (state.iteration < 4) {

        final int count = rand.nextInt(10) + 1;

        System.out.println(String.format("*** Generate %d: start %d (count %d)", state.iteration, state.secret, count));

        Flux<Integer> inner = Flux.range(state.secret, count);


        final int[] last = {Integer.MIN_VALUE};

        sink.next(

                inner

                        .doOnNext(value -> {

                            last[0] = value;

                        })

                        .map(value -> String.format("Iter %d value %d", state.iteration, value))

                        .doOnComplete(() -> {

                            System.out.println(String.format("Inner complete (last item was %d)", last[0]));

                            state.secret = last[0];

                            state.iteration += 1;

                        }));

    } else {

        System.out.println("Generate complete");

        sink.complete();

    }


    return state;

})

        .flatMap(Function.identity())

        .map(value -> {

            System.out.println(String.format("Ext map: %s", value));

            return value;

        })

        .buffer(5)

        .flatMapIterable(Function.identity())

        .subscribe(value -> System.out.println(String.format("  ---> %s", value)));


System.out.println("Exiting");


查看完整回答
反對(duì) 回復(fù) 2024-01-28
  • 1 回答
  • 0 關(guān)注
  • 269 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)