带有Mono.empty()参数的被动Java Mono.zip
使用Spring和Reactor项目将多个api调用压缩为聚合结果。 带有Mono.empty()参数的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.
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);
谢谢你的解决方案