在reactor操作链中,它首先向另一台服务器查询响应,然后根据响应字段,继续reactor
Mono
链或停止。在使用reactor之前,我经常使用if else
来控制是否继续。但是,以下代码将针对 map(any -> null)
抛出 NPE。我可以将下一个 map
的主体放入 if else
中,但那样它不是反应器链。那么如何根据数据验证来停止反应堆运行链呢?基本上,我希望它可以是 Mono.empty
当 map(any -> null)
private Mono<MyResponse> post() {
return client.post()
.uri("/somepath")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.body(new MyRequest(), MyRequest.class)
.retrieve()
.bodyToMono(MyResponse.class);
}
Slice<MyEntity> allBy = myRepository.findAll(pageable);
Flux.fromIterable(allBy.getContent())
.flatMap(entity -> {
return this.post()
.map(response-> {
String img = response.getImg();
if (img ==null || img.equals("")) {
return null;
} else {
return new AnotherVo();
}
})
.map(anotherVo-> {
entity.setField(anotherVo.getField());
myRepository.save(entity);
return 1;
});
}).reduce(Integer::sum)
.block();
也许您正在寻找的是基于某些属性使用过滤操作。 例如:
.flatMap(entity -> {
return this.post()
.filter(response-> response.getImg() != null && !response.getImg().equals(""))
.map(any -> {
var anotherVo = new AnotherVo();
entity.setField(anotherVo.getField());
myRepository.save(entity);
return 1;
});
})
请注意,只有当过滤器发出一些非空信号时,映射才会被执行。如果您想添加后备值,只需使用
.switchIfEmpty(value)