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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

帶有 Mono.empty() 參數(shù)的 Reactive Java Mono.zip

帶有 Mono.empty() 參數(shù)的 Reactive Java Mono.zip

慕尼黑8549860 2023-05-17 15:42:40
使用 Spring 和 Reactor Project 將多個 api 調(diào)用壓縮為聚合結(jié)果。帶有 Mono.empty() 參數(shù)的 Mono.zip() 可以返回空結(jié)果嗎?Mono<Dog> dogMono = dogApiClient.getDog(); // can return Mono.empty()Mono<Cat> catMono = catMono = catApiClient.getCat(); // can returnMono.empty()Mono<Horse> horseMono = horseApiClient.getHorse(); // can return Mono.empty()Mono.zip(dogMono, dogMobo, horseMono)  .map(this::mapToAnimals);預(yù)期結(jié)果:{  dog: null, // if dog is null  cat: null, // if cat is null  horse: null, // if horse is null}實際結(jié)果:{  dog: {    name: null,    surname: null  },   cat: {    name: null,    surname: null  },   horse: {    name: null,    surname: null  }}或者"" // empty
查看完整描述

2 回答

?
紅顏莎娜

TA貢獻1842條經(jīng)驗 獲得超13個贊

好吧,這當然不是一個優(yōu)雅的解決方案,但您可以選擇將您的值包裝在 Optional 中:


Mono<Optional<Dog>> dogMono = Mono.just(Optional.empty());

if(condition1) {

    dogMono = dogApiClient.getDog().map(Optional::of);

}


Mono<Optional<Cat>> catMono = Mono.just(Optional.empty());

if(condition2) {

    catMono = catApiClient.getCat().map(Optional::of);

}


Mono<Optional<Horse>> horseMono = Mono.just(Optional.empty());

if(condition3) {

    horseMono = horseApiClient.getHorse().map(Optional::of);

}


Mono.zip(dogMono, catMono, horseMono)

    .map(this::mapToAnimals);


private Output mapToAnimals(Tuple3<Optional<Dog>, Optional<Cat>, Optional<Horse>> tuple3)

{

    Dog dog = tuple3.getT1().orElse(null);

    Cat cat = tuple3.getT2().orElse(null);

    Horse horse = tuple3.getT3().orElse(null);


    return new Output(dog, cat, horse);

}


查看完整回答
反對 回復(fù) 2023-05-17
?
喵喵時光機

TA貢獻1846條經(jīng)驗 獲得超7個贊

在 Reactive Streams 中,該null值是禁止的。此外,zip期望所有組合的發(fā)布者具有相同數(shù)量的元素?;蛘邠Q句話說:一旦其中一個發(fā)布者完成,它就會短路。


因此,如果您使用Mono.empty(),它會Mono立即完成并觸發(fā) 也zip完成為空。


一種可能的解決方案是為每只動物創(chuàng)建一個“空對象”實例,如下所示:


public static final Dog NO_DOG = new Dog(...);

public static final Cat NO_CAT = new Cat(...);

public static final Horse NO_HORSE = new Horse(...);


Mono<Dog> dogMono = (condition1) ? Mono.just(dogApliClient.getDog()) : Mono.just(NO_DOG);

Mono<Cat> catMono = (condition2) ? Mono.just(catApliClient.getCat()) : Mono.just(NO_CAT);

Mono<Horse> horseMono = (condition3) ? Mono.just(horseApliClient.getHorse()) : Mono.just(NO_HORSE);


Mono.zip(dogMono, catMono, horseMono)

? ? .map(Animals::fromDogCatAndHorse);


Map<String, Object> fromDogCatAndHorse(Tuple3<Dog, Cat, Horse> tuple) {

? ? Map<String, Object> forJson = new HashMap<>(3);


? ? Dog dog = tuple.getT1();

? ? if (dog = NO_DOG) json.put("dog", null); else json.put("dog", dog);


? ? Cat cat = tuple.getT2();

? ? if (cat = NO_CAT) json.put("cat", null); else json.put("cat", cat);


? ? Horse horse = tuple.getT3();

? ? if (horse = NO_HORSE) json.put("horse", null); else json.put("horse", horse);


? ? return forJson;

}


請注意,api 客戶端調(diào)用仍然存在一個大問題:Mono.just(apiClient.blockingCall())模式。


在這里,您實際上是在本應(yīng)是非阻塞控制器的內(nèi)部硬塞一個阻塞調(diào)用...


理想情況下,這些客戶端將返回 aMono<Dog|Cat|Horse>以反映非阻塞性質(zhì)。例如,使用適當?shù)姆亲枞?API,dogMono可以像這樣初始化:


Mono<Dog> dogMono = (condition1) ? dogApiClient.getDogAsync() : Mono.just(NO_DOG);


查看完整回答
反對 回復(fù) 2023-05-17
  • 2 回答
  • 0 關(guān)注
  • 248 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

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