Вызов метода немедленно, если условие истинно

#java #spring-webflux #project-reactor #strategy-pattern

Вопрос:

У меня есть интерфейс IStrategy следующим образом:

 public interface IStrategy {

    Mono<Tuple2<Response, String>> add(final String aString);
    Mono<Boolean> isApplicable(final String aString);
}
 

Кроме того, существует множество классов, реализующих предыдущий интерфейс. Каждая реализация IStrategy интерфейса вызывает разные WS.

Например, это Strategy1 :

 public class Strategy1 implements IStrategy {
    
    @Override
    public Mono<Boolean> isApplicable(String aString) {

     /*
         do some checks and returns 
         Mono.just(Boolean.TRUE) or 
         Mono.just(Boolean.FALSE)
     */

    @Override
    public Mono<Tuple2<Response, String>> add(String aString) {

     /*
           Calls WS 1 and returns a response
     */

     }
}
 

И это еще одна стратегия, которая вызывает другой WS в методе add:

 public class Strategy2 implements IStrategy {
    
    @Override
    public Mono<Boolean> isApplicable(String aString) {

     /*
         do some checks and returns 
         Mono.just(Boolean.TRUE) or 
         Mono.just(Boolean.FALSE)
     */

    @Override
    public Mono<Tuple2<Response, String>> add(String aString) {

     /*
           Calls WS 2 and returns a response
     */

     }
}
 

Проверив isApplicable метод, вы можете определить, какой add метод вызывать.

Так, например:

 List<IStrategy> strategiesList = new ArrayList<>(Arrays.asList(strategy1, strategy2, strategy3);

return Flux.fromIterable(strategiesList)
    .filterWhen(iStrategy -> iStrategy.isApplicable(aString))
    .single()
    .flatMap(iStrategy -> iStrategy.add(aString));
 

Используя предыдущий фрагмент кода, вызываются все isApplicable методы. Затем single применяется инструкция для выбора единственной стратегии iStrategy, которая учитывает isApplicable .

Я хотел бы вызвать isApplicable метод, и если он вернет true Mono, вызовите непосредственно add метод, не вызывая всех isApplicable(s) сначала. Когда isApplicable метод имеет значение true, add метод может быть вызван немедленно.

Ответ №1:

Это то, что вы ищете:

 return Flux.fromIterable(strategiesList)
    .filterWhen(iStrategy -> iStrategy.isApplicable(aString))
    .next()
    .flatMap(iStrategy -> iStrategy.add(aString));
 

next() Метод испускает первый элемент, испускаемый Flux .