带有Mono.empty()参数的被动Java Mono.zip

带有Mono.empty()参数的被动Java Mono.zip,java,spring,reactive-programming,project-reactor,Java,Spring,Reactive Programming,Project Reactor,使用Spring和Reactor项目将多个api调用压缩为聚合结果。 带有Mono.empty()参数的Mono.zip()能否返回空结果 Mono-dogMono=dogApiClient.getDog();//可以返回Mono.empty() Mono-catMono=catMono=catApiClient.getCat();//可以返回mono.empty() Mono-horsemon=horseApiClient.getHorse();//可以返回Mono.empty() Mono.

使用Spring和Reactor项目将多个api调用压缩为聚合结果。 带有Mono.empty()参数的Mono.zip()能否返回空结果

Mono-dogMono=dogApiClient.getDog();//可以返回Mono.empty()
Mono-catMono=catMono=catApiClient.getCat();//可以返回mono.empty()
Mono-horsemon=horseApiClient.getHorse();//可以返回Mono.empty()
Mono.zip(dogMono、dogMobo、horseMono)
.map(此::映射到动物);
预期结果:

{
dog:null,//如果dog为null
cat:null,//如果cat为null
horse:null,//如果horse为null
}
实际结果:

{
狗:{
名称:空,
姓:空
}, 
类别:{
名称:空,
姓:空
}, 
马:{
名称:空,
姓:空
}
}

“”//空

好吧,这当然不是一个优雅的解决方案,但您可以选择将您的值包装在可选内容中:

Mono dogMono=Mono.just(可选的.empty());
如果(条件1){
dogMono=dogApiClient.getDog().map(可选::of);
}
Mono-catMono=Mono.just(可选的.empty());
如果(条件2){
catMono=catApiClient.getCat().map(可选::of);
}
Mono-horsemon=Mono.just(可选的.empty());
如果(条件3){
horseMono=horseApiClient.getHorse().map(可选::of);
}
Mono.zip(dogMono、catMono、horseMono)
.map(此::映射到动物);
私有输出映射到动物(Tuple3 Tuple3)
{
Dog Dog=tuple3.getT1().orElse(null);
Cat=tuple3.getT2().orElse(null);
Horse-Horse=tuple3.getT3().orElse(null);
返回新输出(狗、猫、马);
}

在反应流中,禁止使用
null
值。此外,
zip
期望所有合并的发布者具有相同数量的元素。或者换一种说法:一旦其中一个发布者完成,它就会短路

因此,如果使用
Mono.empty()
,则
Mono
会立即完成,并触发
zip
完成清空

一种可能的解决方案是每个动物都有一个“空对象”实例,如下所示:

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;
}
Mono<Dog> dogMono = (condition1) ? dogApiClient.getDogAsync() : Mono.just(NO_DOG);

谢谢你的解决方案