#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
.