gpt4 book ai didi

Java 8 Lambda 表达式验证

转载 作者:行者123 更新时间:2023-12-01 19:46:48 24 4
gpt4 key购买 nike

我正在阅读有关使用谓词进行验证的文章 here 。我正在尝试在 Spring Boot 框架中实现它,但我有一些问题。

在代码中:

public class LamdaPersonValidator implements PersonValidator {

public void validate(Person person) {
notNull.and(between(2, 12)).test(person.getFirstName()).throwIfInvalid("firstname");
notNull.and(between(4, 30)).test(person.getLastName()).throwIfInvalid("secondname");
notNull.and(between(3, 50)).and(contains("@")).test(person.getEmail()).throwIfInvalid("email");
intBetween(0, 110).test(person.getAge()).throwIfInvalid("age");
}

}

没有提到检查 validate 方法中的 person 对象本身是否为 null 的标准方法是什么。是否可以像 if(persone != null) {//notNull.and..} 这样进行 null 检查,或者可能有更好的方法来进行 null 检查。

另一件事是假设,我想做一些自定义检查,例如person是否存在于数据库中。在这种情况下,我需要连接到数据库来检查。在这种情况下,我需要 Autowiring 静态变量和方法不可能的接口(interface)。

那么,在从数据库进行验证时使用它的最佳方法是什么?

最佳答案

我们不是神圣审判的代码法官,因此我们没有责任告诉您是否“可以进行空检查”。

当然,可以将 is 写成普通的 if 语句,就像我们过去 25 年所做的那样,就像可以发明一个封装 null< 的详细框架一样 检查并以某种方式将术语“lambda”引入其中。唯一剩下的问题是,您是否真的打算编写 if(person != null) {/* do the 检查 */},换句话说,允许 null 通过测试的人。

如果你想拒绝 null 人(这会更合理),已经可以在没有显式测试的情况下编写它,Objects.requireNonNull ,自 Java 7 以来,这表明您不需要“使用 lambda 一切都变得更好”框架来实现该目标。通常,您可以使用常规代码合理地编写验证代码,与本文的示例相反,利用 && 运算符等简单工具并将通用代码放入方法中:

public void validate(Person person) {
Objects.requireNonNull(person, "person is null");
checkString(person.getFirstName(), "first name", 2, 12);
checkString(person.getLastName(), "last name", 4, 30);
checkString(person.getEmail(), "email", 3, 50);
if(!person.getEmail().contains("@"))
throw new IllegalArgumentException("invalid email format");
checkBounds(person.getAge(), "age", 0, 110);
}
private void checkString(String nameValue, String nameType, int min, int max) {
Objects.requireNonNull(nameValue, () -> nameType+" is null");
checkBounds(nameValue.length(), nameType, min, max);
}
private void checkBounds(int value, String valueType, int min, int max) {
if(value < min || value > max)
throw new IllegalArgumentException(valueType+" is not within ["+min+" "+max+']');
}

这与您的代码相同,没有任何名称中带有“Lambda”的框架,仍然具有可读的验证代码并允许重用检查代码。也就是说,您应该使用反射(reflect)类的职责的类名,而不是反射(reflect)实现方式的类名 LamdaPersonValidator。显然,负责验证对象某些属性的 validator 不应与检查数据库中实体是否存在的 validator 混淆。后者本身是一个完全不同的主题,也应该有一个单独的问题。

上面的代码只是一个如何实现与原始代码相同的示例。它永远不应该以这种形式出现在生产代码中,因为它是一种广泛传播的反模式的演示,对属性应用任意不合理的约束,很可能是程序员在编写代码时发明的。

为什么假设一个人必须有名字和姓氏,为什么它假设名字必须至少有两个字符,最多有十二个字符,而姓氏必须有必须在四到三十个字符之间?

实际上它甚至不是字符,因为 char 单位和实际字符之间的关联不是 1:1。

每个考虑实现名称验证的程序员都必须阅读 Falsehoods Programmers Believe About Names (With Examples) .

同样,Wikipedia’s List of the verified oldest people列出了 100 名年龄超过 110 岁的人。

没有理由认为电子邮件地址不能超过 50 个字符。一个true validation of the correct Email pattern可能会被证明是故意省略的东西......

关于Java 8 Lambda 表达式验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52942368/

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