You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何借助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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:09:11