flatmap操作符和conatmap操作符的区别
1.concatMap类似for循环一样遍历处理元素,一个元素处理慢了,后面元素就得等着前面处理完,而flatMap则是并行处理,返回的元素是无序的,谁先处理完谁排放出去。
2.问题查一次团检下的所有医院,再查每家医院下存在的套餐,最后返回一个 ComgcHostitalAndSetMealDto
ComgcHostitalAndSetMealDto类
@Data
public class ComgcHostitalAndSetMealDto {
/***
* 团检医院编码
*/
private String hspCode;
/**
* 团检医院名称
*/
private String hspName;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createdAt;
private List<GcSimpleSetMealBo> comGcGroupSetMeals;
private List<GcSimpleSetMealBo> comGcFamilySetMeals;
}
3.查询团检中所有的医院和每家医院下所有的套餐,最后对数据流进行排序,按照医院的创建时间排序
@Override
public Flux<ComgcHostitalAndSetMealDto> findComGcHospitalAndSetMeal(String gcCode) {
Query query = new Query();
query.addCriteria(Criteria.where("gc_code").is(gcCode)).addCriteria(Criteria.where("enable").is(true));
query.fields().include("code").include("hsp_name").include("hsp_code").include("created_at");
return reactiveMongoTemplate.find(query, ComGcHospital.class)
.flatMap(comGcHospital -> {
ComgcHostitalAndSetMealDto comgcHostitalAndSetMealDto = new ComgcHostitalAndSetMealDto();
comgcHostitalAndSetMealDto.setHspName(comGcHospital.getHspName());
comgcHostitalAndSetMealDto.setHspCode(comGcHospital.getHspCode());
comgcHostitalAndSetMealDto.setCreatedAt(comGcHospital.getCreatedAt());
List<GcSimpleSetMealBo> comGcGroupSetMeals = new ArrayList<>();
List<GcSimpleSetMealBo> comGcFamilySetMeals = new ArrayList<>();
Query query1 = new Query();
query1.addCriteria(Criteria.where("gc_hsp_code").is(comGcHospital.getCode()));
query1.addCriteria(new Criteria().orOperator(
Criteria.where("type").is(Globals.GcSetMeal.Type.GROUP.getName()),
Criteria.where("type").is(Globals.GcSetMeal.Type.FAMILY.getName())));
query1.with(Sort.by(Sort.Order.asc("sort_no"), Sort.Order.asc("created_at")));
return reactiveMongoTemplate.find(query1, ComGcSetMeal.class)
.map(comGcSetMeal -> {
String sellingPrice = ValueUtil.decimal128ToString(comGcSetMeal.getSellingPrice());
GcSimpleSetMealBo gcSimpleSetMealBo = new GcSimpleSetMealBo();
gcSimpleSetMealBo.setSellingPrice(sellingPrice);
return ConvertUtil.convert(comGcSetMeal, gcSimpleSetMealBo);
})
.collectList()
.flatMap(comGcSetMealsList -> {
if (CollectionUtils.isEmpty(comGcSetMealsList)) {
return Mono.just(comgcHostitalAndSetMealDto);
}
for (GcSimpleSetMealBo gcSetMealBo : comGcSetMealsList) {
if (gcSetMealBo.getType().equals(Globals.GcSetMeal.Type.GROUP.getName())) {
comGcGroupSetMeals.add(gcSetMealBo);
}
if (gcSetMealBo.getType().equals(Globals.GcSetMeal.Type.FAMILY.getName())) {
comGcFamilySetMeals.add(gcSetMealBo);
}
}
comgcHostitalAndSetMealDto.setComGcGroupSetMeals(comGcGroupSetMeals);
comgcHostitalAndSetMealDto.setComGcFamilySetMeals(comGcFamilySetMeals);
return Mono.just(comgcHostitalAndSetMealDto);
});
})
.sort(Comparator.comparing(ComgcHostitalAndSetMealDto::getCreatedAt));
}