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

如何对Flux进行异步过滤,实现商铺及关联库存的关键词检索

问题核心原因

你当前代码的错误在于使用了同步的filter算子,它要求传入的断言函数必须同步返回boolean值,但你在判断库存的分支返回的是Publisher类型,类型完全不匹配,无法正常执行。要实现异步过滤逻辑,应该使用WebFlux提供的filterWhen算子,它支持返回Mono<Boolean>的异步判断结果。

修改后的完整代码

@Override
public Flux<Shop> searchShopsBySearchingTextInShopsAndStocks(String searchText) {
    return shopRepo.findAll()
            // filterWhen支持异步判断逻辑
            .filterWhen(shop -> {
                // 优先判断商铺本身的字段是否匹配
                boolean shopMatch = shop.getTitle().contains(searchText) 
                        || shop.getDescription().contains(searchText);
                if (shopMatch) {
                    // 商铺本身匹配直接返回结果,无需发起多余的库存查询
                    return Mono.just(true);
                }
                // 商铺不匹配时查询关联库存,判断是否存在至少一条匹配的库存
                return stockService.findStocksByShopId(shop.getId())
                        // Flux的any算子会自动判断是否有元素满足断言,直接返回Mono<Boolean>
                        .any(stock -> stock.getTitle().contains(searchText)
                                || stock.getDescription().contains(searchText));
            });
}

逻辑说明

  • 优先校验商铺自身字段,匹配就直接返回结果,降低不必要的数据库查询开销
  • any算子天然符合"只要有一条库存匹配就算商铺符合条件"的需求,不需要自己遍历判断
  • 如果业务场景存在字段为空的可能,可以在contains判断前增加非空校验,示例:Optional.ofNullable(shop.getTitle()).orElse("").contains(searchText),避免空指针异常

内容的提问来源于stack exchange,提问作者Serg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 01:06:07