我可以有多种方法来做到这一点。
我尝试创建一个可以进行这种验证链接的验证器接口。
虽然它不是一个完美的解决方案,但它可能会给你一个开始的想法。它是一个非常通用的解决方案(可以使用 ? super 和 ? extends 更通用 - 你可以自己尝试)
代码:
package pecs;
import javafx.util.Pair;
public class Chaining {
public static void main(String[] args) {
Validation<Integer, String, Message> validation = (a, b, c) -> {
return new Pair(a > 30, new Message("a should not be greater than 30"));
};
Validation<Integer, String, Message> validation2 = (a, b, c) -> {
return new Pair(a > 20, new Message("a should not be greater than 20"));
};
Validation<Integer, String, Message> validation3 = (a, b, c) -> {
return new Pair(a > 10, new Message("a should not be greater than 10"));
};
Validation<Integer, String, Message> validation4 = (a, b, c) -> {
return new Pair(a > 5, new Message("a should not be greater than 5"));
};
//One way to call
Validation<Integer, String, Message> validator = validation
.and(validation2)
.and(validation3)
.and(validation4);
System.out.println(validator.validate(4, "A00", 0));
System.out.println(validator.validate(9, "A00", 0));
System.out.println(validator.validate(11, "A00", 0));
System.out.println(validator.validate(21, "A00", 0));
System.out.println(validator.validate(31, "A00", 0));
//Another way to call
Pair<Boolean, Message> pair = validation
.and(validation2)
.and(validation3)
.and(validation4)
.validate(4, "String", 0);
if(pair.getKey() == false) {
System.out.println("All Validation successful");
} else {
System.out.println(pair);
}
}
}
代码中使用的验证器接口:
package pecs;
import javafx.util.Pair;
import java.util.Objects;
@FunctionalInterface
public interface Validation<A, B, C> {
Pair<Boolean, C> validate(A a, B b, int count);
default Validation<A, B, C> and(Validation<A, B, C> other) {
Objects.requireNonNull(other);
return (a, b, c) -> {
// System.out.println("c=" + c);
Pair<Boolean, C> validate = validate(a, b, c+1);
if (validate.getKey() == true) {
return validate;
} else {
//Termination condition.
if(c == 0) {
Pair<Boolean, C> pair = other.validate(a, b, c);
if(pair.getKey() == false) {
return new Pair<>(false, null);
} else {
return pair;
}
} else {
return other.validate(a, b, c);
}
}
};
}
}
如果有任何改进,请查看并提出建议。
还有许多其他方法可以进行验证。例如,检查此链接:
https://dzone.com/articles/server-side-validator-using-functional-interfaces