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



我有一个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语句来选择唯一符合isApplicable的iStrategy。

我想调用isApplicable方法,如果它返回一个真正的单声道,直接调用add方法,而不首先调用所有的isApplicable(s)。当isApplicable方法为true时,可以立即调用add方法。

这就是你要找的:

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

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