首页 > 解决方案 > 验证多个 java 对象字段是否不为空

问题描述

我想检查必填字段(姓名、年龄和邮政编码)是否包含值或不为空。

典型的方式是

        Person person = new Person();
        person.setName("Cookie");
        person.setAge(20);

//validation
    if(person.getAge() != null && person.getName() != null){
        return true;
    }

在我原来的课程中,我有 20 多个字段需要检查,因此我想知道是否有更优雅的方法来执行此操作?

简单的 POJO 类示例:

public class Person {
 
   String name;
 
   int age;
 
   String address;
 
   int postcode;
 
   public Person() {
   }
 
   public String getName() {
      return this.name;
   }
 
   public void setName(String value) {
      this.name = value;
   }
 
//...etc setter and getters
}

标签: javavalidationpojo

解决方案


鉴于您所有的 getter 都返回一个引用类型(没有原语)并且您只需要检查结果是否为nullnull您可以试试这个:

...
private final List<Supplier<Object>> m_Getters = new ArrayList<>();
...

public Person()
{
    m_Getters.add( this::getName );
    m_Getters.add( this::getAge ); // getAge() must return Integer, not int!!!
    m_Getters.add( this::getAddress );
    ...
 }

 ...

 public final boolean validate()
 {
      return m_Getters.stream().allMatch( s -> s.get() != null );
 }

您也可以从反射调用的结果中填充列表,尽管您必须为 getter 过滤该结果。谓词 forStream.allMatch()会更复杂一些。


推荐阅读