首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 8谓词验证器实现

Java 8谓词验证器实现
EN

Stack Overflow用户
提问于 2018-02-07 05:22:14
回答 1查看 4.2K关注 0票数 0

我读过这篇关于Java验证器实现的文章(https://dzone.com/articles/fail-fast-validations-using)。

代码语言:javascript
复制
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实现谓词。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-07 05:44:38

它不是GenericValidator#test内部的递归调用,您正在调用predicate.test(tovalidate),其中谓词是在GenericValidator对象创建期间通过构造函数传递的对象。所以,

代码语言:javascript
复制
predicate -> predicate.test(toValidate)

上面的语句将调用作为构造函数参数传递的谓词的测试方法(您已经传递了谓词的列表)。下面是您可以轻松测试它的代码。

代码语言:javascript
复制
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));
  }
}

输出:

代码语言:javascript
复制
Validating the input inside test....
Is greater than 5
Is less than 10

因此,您可以看到它“验证内部测试中的输入”只有一次打印。因此,它不会是一个递归调用。

编辑:

在这里,我试着回答你的问题,在评论。下面是实现谓词接口的旧方法的示例。然而,我们非常不鼓励这样做。

代码语言:javascript
复制
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类,那么它可以工作。

代码语言:javascript
复制
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));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48656525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档