如何对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
相关产品推荐
相关产品推荐

