簡體   English   中英

如何迭代 Flux 以產生新的 Flux 並仍然以 Reactive 方式工作?

[英]How to iterate on a Flux to produce a new Flux and still work in a Reactive way?

我有 2 種方法,分別生成Flux<String>Flux<Integer>

public Flux<String> buildName() {
        return Flux.just(personProcessor.buildName());
    }

public Flux<Integer> computeAge() {
        return Flux.just(personProcessor.computeAge());
    }

這些方法生成隨機值來填充一個人 object。

現在我想迭代並創建 X Person,每個人都有隨機值。

我創建了一個新的 Flux( processor是持有方法的服務的名稱):

Flux<Person> persons = Flux.zip(processor.buildName(), processor.computeAge(),
                (name, age) -> Person.builder().name(name).age(age).build() );

我的問題是,當我在“人員”Flux 上使用常規循環進行迭代時,我總是得到具有相同名稱和年齡值的 Person 對象。 我認為這很正常,因為我的循環只訂閱了 Flux,然后得到了 Flux 的相同“第一個”object。 我只是不知道如何迭代 Flux“人”,以便每次都能獲得一個具有自己的姓名和年齡值的人 object。

我如何在此 Flux 上迭代 X 次以獲得具有隨機值的 X Person 對象?

當然,這個迭代也應該產生一個 Flux 來讓我處理 Person object。

您可以按如下方式簡化它:

Flux.range(1, n)
        .map(i -> Person.builder()
                   .name(personProcessor.buildName())
                   .age(personProcessor.computeAge())
                   .build())

除了 Ikatiforis 最簡單的解決方案外,您還可以執行以下類似於原始解決方案的操作。 如果以某種異步方式提供隨機值,這將很有用。

public Flux<String> buildName() {
    return Mono.fromCallable(() -> personProcessor.buildName()).repeat();
}

public Flux<Integer> computeAge() {
    return Mono.fromCallable(() -> personProcessor.computeAge()).repeat();
}

然后zip部分幾乎相同:

Flux<Person> persons = Flux.zip(processor.buildName(), processor.computeAge(),
        (name, age) -> Person.builder().name(name).age(age).build())
    .take(X);

暫無
暫無

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

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