如果条件为真,则立即调用方法

Calling a method immediately if the condition is true

我有一个 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
     */

     }
}

这是另一个在 add 方法中调用不同 WS 的策略:

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 语句应用于 select 唯一尊重 isApplicable.

的 iStrategy

我想调用 isApplicable 方法,如果它 returns 是一个真正的 Mono,直接调用 add 方法,而不调用所有 isApplicable(s) 第一的。 当isApplicable方法为真时,可以立即调用add方法。

这就是您要查找的内容:

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

next() 方法发出由 Flux 发出的第一个项目。