Java8:如何检查一个对象的所有字段是否都为空,只有一个字段除外

Java8:如何检查一个对象的所有字段是否都为空,只有一个字段除外,java,java-8,Java,Java 8,我想检查一个实例化类的所有字段是否都是空的,除了id之外 例如: class Doggy { String id; String name; String breed; String eyeColour; String hairColour; Integer age; Long height; Long weight; //getters & setters } 我想知道使用Java8是否可以实现。 先谢谢你 我有一个实例化对象,如

我想检查一个实例化类的所有字段是否都是空的,除了id之外

例如:

class Doggy {
   String id;
   String name;
   String breed;
   String eyeColour;
   String hairColour;
   Integer age;
   Long height;
   Long weight;
   //getters & setters
}
我想知道使用Java8是否可以实现。 先谢谢你

我有一个实例化对象,如下所示:

Doggy doggy = new Doggy;
doggy.setId("123");
我想要一种更优雅的方式来完成以下工作:

if (doggy.getId()!=null && doggy.getName()==null && doggy.getBreed()==null && 
        doggy.getEyeColour()==null && doggy.getHairColour()==null && 
        doggy.getAge()==null && doggy.getHeight()==null && doggy.getWeight()==null) {
   doSomething();
}
创建如下方法:

public void checkFields(Doggy obj) throws DoggyNULLException
{
if (obj.getName().isBlank())
 throw new DoggyNULLException();
}
每个领域都要这样做
isBlank()是用于null obj的方法。

如果这里的java 8指的是使用您可以执行的流

Doggy Doggy=new Doggy();
doggy.id=“1”;
布尔AllisAllButid=Arrays.stream(Doggy.class.getDeclaredFields()).allMatch(f->{
试一试{
返回(f.getName().equals(“id”)和&f.get(doggy)!=null)| | f.get(doggy)==null;
}捕获(非法访问例外e){
返回false;
}
});

如果您只想在Java 8中使用streams执行此操作,那么您可以简单地筛选一个
列表
,以查找未按需要初始化的实例:

public static void main(String[] args) {
    List<Doggy> doggies = new ArrayList<>();
    doggies.add(new Doggy(null, "Cujo", "Bernard", "blue-green", "white-brown",
            Integer.valueOf(3), Long.valueOf(14), Long.valueOf(11)));
    doggies.add(new Doggy(null, "Lassie", "Collie", "blue", "brown",
            Integer.valueOf(8), Long.valueOf(9), null));
    doggies.add(new Doggy("ID", "Wolfy", "Husky", "icy-blue", "gray-white",
            Integer.valueOf(5), Long.valueOf(11), Long.valueOf(10)));
    doggies.add(new Doggy(null, "Rex", null, "blue", "brown",
            Integer.valueOf(9), Long.valueOf(10), Long.valueOf(10)));

    // "simply" filter and check all the fields if they are null
    List<Doggy> doggiesNotInitializedAsDesired = doggies.stream()
            .filter(doggy -> doggy.getName() == null || doggy.getBreed() == null 
                    || doggy.getEyeColour() == null || doggy.getHairColour() == null 
                    || doggy.getAge() == null || doggy.getHeight() == null
                    || doggy.getWeight() == null 
                    || doggy.getId() != null) // check == null for the special case ID
            .collect(Collectors.toList());

    doggiesNotInitializedAsDesired.forEach(System.out::println);
}

您可以将构造函数中需要的所有字段设置为必填字段。 这里有两个使用Lombok库()的示例:

对于实例化时的强制参数,如newdoggy(“mandatoryName”,1,等等)

如果无法使用所有参数实例化对象,则本例允许创建如下对象:new Doggy();但是您需要确保您正在为每个强制参数调用所有Doggy setter。(有关更多信息,请参见文档:)

更标准的解决方案是使用javax.valid,下面是一个完整的示例:

class Doggy {
   String id;
   String name;
   String breed;
   String eyeColour;
   String hairColour;
   Integer age;
   Long height;
   Long weight;
   //getters & setters
}

问候

是否尝试在字段上使用空相等?很难准确理解你在这里想要实现什么好吧,我纠正了!我想要这样的东西,但这会检查所有字段
if(Stream.of(doggy).allMatch(Objects::isNull)){doSomething;}
您可以使用反射将参数转换为键/值的映射,或者如果您不关心字段名,则可以使用值列表。然后使用类似于代码片段的方法检查空值。值得寻找答案。没有比这更优雅的方式了。充其量,您可以向Doggy类添加一个进行检查的方法,比如
public boolean hasibdutnodata()
。我的意思是,她应该按照需要使用它的每一个适当的方式来做。正如前面有人所说,原语不能为null。那么
Integer
呢?为什么不简单地询问属性是否不等于null
isBlank()
不是用来检查null的。好吧,我猜是空白的,这是她需要的字符串。否则,这只是我的意见。和平请再次检查您的代码。它在allNice方法中不调用apachecommons,但是
getFields()
应该是
getDeclaredFields()
以包含非公共字段。在OP的
Doggy
类中,
getFields()
将产生一个空数组,如果我没有弄错的话,因为她的字段当前是类私有的(通常您会有带有公共getter/setter的私有字段)。除此之外,它似乎是有效的。
@Data
@NoArgsConstructor // Here is the difference
public class Doggy {
    private Integer id;
    @NonNull
    private String name;
    @NonNull
    private BigDecimal amount;
}

//
final Doggy doggy = new Doggy();
...
doggy.setName(null);

// doggy.setName(null) is firing this generated code by Lombok:
public void setName(@NonNull final String name) {
        if (name == null) {
            throw new NullPointerException("name is marked non-null but is null");
        } else {
            this.name = name;
        }
    }