【问题标题】:How to define failed predicate in composite Guava predicate如何在复合 Guava 谓词中定义失败的谓词
【发布时间】:2020-04-01 23:08:07
【问题描述】:

我有要执行的“用户”验证列表,每个验证都实现了 Predicate(来自 Guava)。我有以下方法填充要执行的验证列表并创建所有验证的组合谓词。

List<Validation> validations = new ArrayList();

Predicate<User> composedUserValidations;

private void setupValidations() {
    validations.add(userEmailIsValid());
    validations.add(userPhoneIsValid());
    validations.add(userLoginIsValid());
    .....
    //creating composite
    composedUserValidations = and(validations);
}

问题:当我将触发 apply 到composedUserValidations 并且其中一个会失败时,有没有办法找出究竟是哪一个失败了。 现在我有:

public boolean isUserValid(User user) {
    if (!composedUserValidations.apply(user)) {
        return false;
    }
}

我想要类似的东西:

public void validateUser(User user) {
    if (!composedUserValidations.apply(ticket)) {
        throw new ValidationExcepction("Predicate which failed");
    }
}

最好的方法是什么?

【问题讨论】:

    标签: java guava


    【解决方案1】:

    您可以为您的 User 类设计一个构建器,我们将其命名为 UserBuilder

    对于构建器类中User 的每个属性(登录名、电子邮件、电话),您不仅可以提供要为User 实例设置的值,还可以提供Predicate ,您可以立即申请。如果任何谓词失败,您可以轻松抛出异常和/或输出消息等。

    对于您创建的所有实例,您可以选择传递不同的验证规则,或者您可以额外设计您的构建器以跳过对任何 User 字段的验证。

    例子:

    public class UserBuilder {
    
        private String phone;
        private String email;
        //add more properties here;
    
        public void phone(String phone, Predicate<String> phoneValidator) {
            if (!phoneValidator.test(phone)) {
                throw new UserBuilderException("Invalid phone provided");
            }
            this.phone = phone;
            return this;
        }
    
        public void email(String email, Predicate<String> emailValidator) {
            if (!emailValidator.test(email)) {
                throw new UserBuilderException("Invalid email provided");
            }
            this.email = email;
            return this;
        }
    
        //add more builder methods here
    
        public User build() {
            return new User(phone, email);
        }
    
    }
    

    你可以使用它:

    Predicate<String> phoneValidator = ....
    Predicate<String> emailValidator = ....
    
    User user = new UserBuilder()
                .phone("123567", phoneValidator)
                .email("something@example.com", emailValidator)
                .build();
    

    你得到的是:

    • 为您拥有的每个 User 实例提供自定义验证规则(或省略其中一些)的灵活性。
    • 更好地了解哪些属性未通过相应的验证规则。
    • 没有使用无效内容创建的User 实例。仅为属性元组创建User 实例,这些属性元组传递所有在其构建器中提供的Predicates。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多