Как асинхронно фильтровать поток

#java #spring-webflux #project-reactor

#Ява #пружинный вебфлюкс #проект-реактор

Вопрос:

Мне нужно проверить, содержится ли подстрока в названии магазина или акций в этом магазине.

 @Override  public Fluxlt;Shopgt; searchShopsBySearchingTextInShopsAndStocks(String searchText) {  // I received Flxuxlt;Listlt;Shopgt;gt;   return shopRepo.findAll().  // next I check if substring in title of shop  filter(shop -gt; {  if (shop.getTitle().contains(searchText) || shop.getDescription().contains(searchText)) {    // if contains then return TRUE if not check in stocks  return true;  } else {  // reeived all stock Fluxlt;Listlt;Stockgt;gt; of this shop and check  return stockService.findStocksByShopId(shop.getId()).  flatMap(stock -gt; {  if (stock.getDescription().contains(searchText) || stock.getTitle().contains(searchText)) {   // and in this place I need help   return // true  }   return //false   });   }); }  

При проверке содержимого подстроки в запасах мне достаточно одного вхождения.

Ответ №1:

Глядя на Flux#filter подпись оператора:

 Fluxlt;Tgt; filter(Predicatelt;? super Tgt; p)  

мы видим, что он принимает простой предикат Java в качестве параметра. В нем нельзя выполнять асинхронные операции.

Вместо этого вы можете использовать filterWhen оператор:

 shopRepo.findAll()   .filterWhen(shop -gt;  (shop condition) ? Mono.just(true) :  stockService.findStocksByShopId(shop.getId())  .map(stock -gt; (stock condition)))