gpt4 book ai didi

Java lambda 表达式 : Combinator-Pattern Improvement

转载 作者:太空宇宙 更新时间:2023-11-04 10:34:51 25 4
gpt4 key购买 nike

我在网上找到这篇文章:https://gtrefs.github.io/code/combinator-pattern/ 。作者描述了网站上用户的验证过程,该过程要求用户提供姓名、电子邮件和年龄。如果验证过程失败,它将输出一条错误消息。

在我看来,这种方法非常好,可以让代码易于理解。然而,他的解决方案有一个缺点。最终,这种模式当时只产生了一个错误。当名称为空并且电子邮件不包含 @ 符号时,它仅打印“名称为空”。

基于代码片段

static UserValidtion all(UserValidation... validations){ 
// Your code here
}

在文章末尾,我尝试创建一个方法来生成这些错误的列表。

但是我想出了一个非常糟糕的解决方案,在 UserValidation 界面中打印原因。尽管如此,它会产生一个 NullPointerException (在这里您可以执行我的代码: http://tpcg.io/WSI2u3 ):

用户验证.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接口(interface)中添加静态ArrayList来保存通过的原因。不起作用,因为主方法中的调用仅接受 UserValidation-Object。
  • 在 ValidationResult 接口(interface)中添加了一个 ArrayList 来存储原因列表。也没有成功,因为我无法立即访问所有原因。

提前致谢。

最佳答案

我对您的代码做了一些更改

    static Function< User, List<ValidationResult> > all(UserValidation... validations){
return user ->
{
return Arrays.stream(validations).map(validation ->
validation.apply(user)
).filter(vr-> !vr.isValid())
.collect(Collectors.toList());

};
}

并更改了 main 以显示验证错误。

        UserValidation rules[] = {UserValidation.nameIsNotEmpty(),UserValidation.eMailContainsAtSign()};
Function< User, List<ValidationResult> > validation = UserValidation.all(rules);
User gregor = new User("", 30, "mailmailinator.com");
List<ValidationResult> result = validation.apply(gregor);

result.forEach(item -> System.out.println(item.getReason().get()));

看起来它会按照你的要求工作。

关于Java lambda 表达式 : Combinator-Pattern Improvement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49598760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com