如何借助Java Reactor改写含if判断的查询构建代码?
用Reactor操作符替代多if条件构建Query
原代码示例(多if判断版本)
// 假设的原实现逻辑 public Query buildQuery(UserFilter filter) { Query query = new Query(); if (filter.getName() != null) { query.addCriteria(Criteria.where("name").is(filter.getName())); } if (filter.getAge() != null) { query.addCriteria(Criteria.where("age").gte(filter.getAge())); } if (filter.getStatus() != null) { query.addCriteria(Criteria.where("status").is(filter.getStatus())); } return query; }
改造后的响应式实现(无if语句)
public Mono<Query> buildQueryReactive(UserFilter filter) { return Flux.just( Optional.ofNullable(filter.getName()).map(name -> Criteria.where("name").is(name)), Optional.ofNullable(filter.getAge()).map(age -> Criteria.where("age").gte(age)), Optional.ofNullable(filter.getStatus()).map(status -> Criteria.where("status").is(status)) ) .filter(Optional::isPresent) .map(Optional::get) .collectList() .map(criteriaList -> { Query query = new Query(); criteriaList.forEach(query::addCriteria); return query; }); }
核心逻辑说明
- 初始化条件流:用
Flux.just()把每个过滤器字段对应的Criteria构建逻辑包装成Optional,空值字段会生成空的Optional - 过滤空条件:通过
filter(Optional::isPresent)剔除掉没有有效值的条件项 - 提取有效Criteria:用
map(Optional::get)把非空的Optional转换成实际的Criteria对象 - 收集并构建Query:通过
collectList()把所有有效Criteria收集成列表,最后在map里实例化Query并批量添加Criteria
如果需要同步返回Query而非Mono<Query>,可在兼容场景下调用.block():
public Query buildQuerySync(UserFilter filter) { return buildQueryReactive(filter).block(); }
内容的提问来源于stack exchange,提问作者Luiz Ricardo Cardoso
相关产品推荐
相关产品推荐

