运行一堆布尔函数的最简洁方法,如果其中任何一个是假的,则返回false?

时间:2018-05-28 21:36:44

标签: java

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

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

我可以说有多达10个验证器功能。

显然这不起作用,因为如果func1为false且func2为true,则覆盖布尔值。我的问题是,如果任何函数eval为false,我想返回false,否则返回true。

5 个答案:

答案 0 :(得分:3)

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

interface Validator {
    boolean isValid(MyObject obj);
}


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

答案 1 :(得分:1)

使用&&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 Alternative to Utility Classes。我发现这是最干净的解决方案。

答案 2 :(得分:1)

使用&amp;&amp ;: 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);
}

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

答案 3 :(得分:0)

如果你想运行所有的验证器(因为它们正在记录,或者生成一个验证失败的列表以通知)并返回最终结果,那么

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

答案 4 :(得分:0)

如果有很多功能,你可以将布尔值存储在一个arraylist中,然后迭代列表。如果列表中的布尔值在任何时候都为false,则返回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;

}