I have this interface that then I create a List of implementation in order to execute sequentially, but this implementations are variable because in future releases we can add or delete several validations.
This is my interface:
import java.util.function.Function;
import io.reactivex.Single;
public interface Validator<T> {
Single<T> validate(T data);
default Function<T,Single<T>> reactiveFunction() {
return (a) -> this.validate(a) ;
}
default Single<T> chainFunctions(T data, Function<T,Single<T>>... validators) {
if (validators.length == 1) {
return validators[0].apply(data);
}
else {
Single<T> result = Single.just(data);
for(Function<T,Single<T>> validator: validators) {
result = result.flatMap(x -> validator.apply(x));
}
return result;
}
}
}
Can I do chainFunctions
more reactive and functional like this answer?
@SafeVarargs
private static <T> Function<T, T> combineF(Function<T, T>... funcs) {
return Arrays.stream(funcs).reduce(Function.identity(), Function::andThen);
}
[Edit with suggestions]
I changed my interface like this:
import java.util.function.Function;
import io.reactivex.Single;
public interface Validator<T> {
Single<T> validate(final T data);
default Function<Single<T>,Single<T>> reactiveFunction() {
return x -> x.flatMap(this::stepValidator) ;
}
default Single<T> chainFunctions(final T data, Function<Single<T>,Single<T>>... validators) {
return Flowable.fromArray(validators)
.reduce((s1,s2) -> s1.andThen(s2))
.switchIfEmpty(Single.fromCallable(() -> a -> a))
.flatMap(f -> f.apply(Single.just(data));
}
}