我读过这篇关于Java验证器实现的文章(https://dzone.com/articles/fail-fast-validations-using)。
import java.util.LinkedList;
import java.util.List;
import java.util.function.Predicate;
public class GenericValidator<T> implements Predicate {
private final List<Predicate<T>> validators = new LinkedList<>();
public GenericValidator(List<Predicate<T>> validators) {
this.validators.addAll(validators);
}
@Override
public boolean test(final T toValidate) {
return validators.parallelStream()
.allMatch(predicate -> predicate.test(toValidate));
}
}这个调用不是用来测试递归调用的吗?比方说,在测试函数内部调用predicate.test实现谓词。
发布于 2018-02-07 05:44:38
它不是GenericValidator#test内部的递归调用,您正在调用predicate.test(tovalidate),其中谓词是在GenericValidator对象创建期间通过构造函数传递的对象。所以,
predicate -> predicate.test(toValidate)上面的语句将调用作为构造函数参数传递的谓词的测试方法(您已经传递了谓词的列表)。下面是您可以轻松测试它的代码。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Predicate;
public class Practice {
public static void main(String args[]) {
List<Predicate<Integer>> vaList = new ArrayList<>();
vaList.add(Practice::isGreaterThan5);
vaList.add(Practice::isLessThan10);
GenericValidator<Integer> genericValidator = new GenericValidator(vaList);
genericValidator.test(8);
}
public static boolean isGreaterThan5(int e){
System.out.println("Is greater than 5");
return e>5;
}
public static boolean isLessThan10(int e){
System.out.println("Is less than 10");
return e<10;
}
}
class GenericValidator<T> implements Predicate<T> {
private final List<Predicate<T>> validators = new LinkedList<>();
public GenericValidator(List<Predicate<T>> validators) {
this.validators.addAll(validators);
}
@Override
public boolean test(final T toValidate) {
System.out.println("Validating the input inside test....");
return validators.parallelStream()
.allMatch(predicate -> predicate.test(toValidate));
}
}输出:
Validating the input inside test....
Is greater than 5
Is less than 10因此,您可以看到它“验证内部测试中的输入”只有一次打印。因此,它不会是一个递归调用。
编辑:
在这里,我试着回答你的问题,在评论。下面是实现谓词接口的旧方法的示例。然而,我们非常不鼓励这样做。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.function.Predicate;
public class Practice {
public static void main(String args[]) {
List<Predicate<Integer>> vaList = new ArrayList<>();
vaList.add(new GeraterThan5Predicate());
vaList.add(new LessThan10Predicate());
GenericValidator<Integer> genericValidator = new GenericValidator(vaList);
genericValidator.test(8);
}
}
class GeraterThan5Predicate implements Predicate<Integer> {
@Override
public boolean test(Integer e) {
System.out.println("Is greater than 5");
return e > 5;
}
}
class LessThan10Predicate implements Predicate<Integer> {
@Override
public boolean test(Integer e) {
System.out.println("Is less than 10");
return e > 10;
}
}
class GenericValidator<T> implements Predicate<T> {
private final List<Predicate<T>> validators = new LinkedList<>();
public GenericValidator(List<Predicate<T>> validators) {
this.validators.addAll(validators);
}
@Override
public boolean test(final T toValidate) {
System.out.println("Validating the input inside test....");
return validators.parallelStream().allMatch(predicate -> predicate.test(toValidate));
}
}以及您为什么需要通过GenericValidator实现谓词接口。我真的不能回答这个问题。如果您像下面这样编写您的GenericValidator类,那么它可以工作。
class GenericValidator<T>{
private final List<Predicate<T>> validators = new LinkedList<>();
public GenericValidator(List<Predicate<T>> validators) {
this.validators.addAll(validators);
}
public boolean test(final T toValidate) {
System.out.println("Validating the input inside test....");
return validators.parallelStream().allMatch(predicate -> predicate.test(toValidate));
}
}https://stackoverflow.com/questions/48656525
复制相似问题