【发布时间】:2018-04-01 13:53:26
【问题描述】:
我在网上找到这篇文章:https://gtrefs.github.io/code/combinator-pattern/。作者描述了在网站上要求用户提供姓名、电子邮件和年龄的验证过程。如果验证过程失败,它将输出错误消息。
在我看来,这种方法可以很好地保持代码的可理解性。但是,他的解决方案有一个缺点。最后,这种模式当时只产生了一个错误。当名称为空且电子邮件不包含 @ 符号时,它仅打印“名称为空”。
基于代码sn-p
static UserValidtion all(UserValidation... validations){
// Your code here
}
在文章的最后,我尝试创建一个方法来生成这些错误的列表。
但我想出了一个非常糟糕的解决方案,可以在 UserValidation 界面中打印原因。不过,它会产生一个 NullPointerException(在这里你可以执行我的代码:http://tpcg.io/WSI2u3):
UserValidation.java
static UserValidation all(UserValidation... validations){
return user ->
{
Arrays.stream(validations).forEach(validation -> {
//returns the reason why one of the user inputs is not valid
System.out.println(validation.apply(user).getReason());
//I don't know how to combine the reasons here to have a proper output in the main.
});
return null;
};
}
Main.java
public class Main {
public static void main(String[] args) {
UserValidation rules[] = {UserValidation.nameIsNotEmpty(),UserValidation.eMailContainsAtSign()};
UserValidation validation = UserValidation.all(rules);
User gregor = new User("", 30, "mailmailinator.com");
ValidationResult result = validation.apply(gregor);
result.getReason().ifPresent(System.out::println);
}
}
我对 lambda 表达式非常陌生,但我尝试了很多,但它不适合这种方法。 这是我尝试过的:
- 在UserValidation接口中增加了一个静态ArrayList来保存传递的原因。无效,因为 main-method 中的调用仅接受 UserValidation-Object。
- 在 ValidationResult 接口中添加了一个 ArrayList 来存储原因列表。也没有工作,因为我无法一次访问所有原因。
提前致谢。
【问题讨论】:
-
您需要创建一个
CompositeValidationResult,它接受多个ValidationResult,并为您提供List<String>,而不是Optional<String>。那么您的all将只是reduce。