运行一堆布尔函数并在其中任何一个为假时返回 false 的最干净方法?



>我有这个静态实用程序来验证pojo数据。

isValid = validateFunc1(pojo1);
isValid = validateFunc2(pojo1);
......
return isValid;

比方说,我可以有多达 10 个验证器函数。

显然这是行不通的,因为如果 func1 为假而 func2 为真,则布尔值将被覆盖。我的问题是,如果任何函数评估为 false,我想返回 false,否则返回 true。

每当看到这样的重复代码时,最好问一下用循环或等效项(例如流操作(替换一堆重复是否值得。这个案例是一个很好的候选者:

interface Validator {
boolean isValid(MyObject obj);
}

List<Validator> validators = getValidators();
return validators.stream().allMatch(v -> v.isValid(obj));

使用 &&:return validateFunc1(pojo1) && validateFunc2(pojo1)

编辑:

你也可以做这样的事情:

public interface Validator {
boolean validate(Pojo pojo);
}
public class ValidatorA implements Validator {
@Override
public boolean validate(Pojo pojo) {
...
}
}
public StaticUtilityClass {
private static final List<Validator> validators = ... ; // Add new ValidatorA(), new ValidatorB(), etc.
...
Pojo pojo = ...;
return validators.stream().allMatch(pojo::validate);
}

但这需要为每个验证器创建一个类。

使用&&(and( 运算符。这个是短路的。这意味着如果左操作数被计算false,那么右操作数将根本不会被计算,跳过。

return (validateFunc1(pojo1) && validateFunc2(pojo2));

假设您提供了大量布尔结果。使用循环并停止检查以使其像短路一样。为了简洁起见,让我们先定义函数结果的数组,然后执行迭代。

// mock
boolean[] array = new boolean[] {true, true, true, true, false, false, true, true};
// iteration
boolean valid = true;
for (boolean b: array) {
if (!valid) { break; }
valid = valid && b;
}

我建议您逐个管理循环中可调用的方法。然后,您无需验证所有这些,因为其中一个已经失败。但是,您必须先提供有关这些验证方法的信息。


个人建议:

例如,将静态方法转换为类,如NameValidatedEmailValidated...实现Validated并将它们堆叠在要循环的数组中:

for (Validated validated: arrayOfValidated) {
if (!valid) { break; }
valid = valid && validated.get();
} 

使用类而不是静态方法有很多优点。如果有兴趣,请阅读文章 OOP 实用程序类的替代方法。我发现这是最干净的解决方案。

如果要运行所有验证程序而不考虑(因为它们正在记录,或者生成要通知的验证失败列表(并返回最终结果,则

boolean valid = validateFunc1(pojo);
valid = validateFunc2(pojo) && valid;
[...]
valid = validateFuncN(pojo) && valid;
return valid;

如果有很多函数,您可以将布尔值存储在数组列表中,然后迭代列表。如果列表中的布尔值在任何时候为 false,则返回 false。如果它在列表中运行并且没有一个是假的(都是真的(,则返回 true:

import java.util.ArrayList;
boolean isValid(){
ArrayList<Boolean> bool_list=new ArrayList<Boolean>();
bool_list.append(validateFunc1(pojo1));
bool_list.append(validateFunc2(pojo1));
...
for(int i=0; i<bool_list.size(); i++){
if(bool_list.get(i)==false){
return false;
}
}
return true;
}

最新更新