Java8:如何检查一个对象的所有字段是否都为空,只有一个字段除外
我想检查一个实例化类的所有字段是否都是空的,除了id之外 例如: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是否可以实现。 先谢谢你 我有一个实例化对象,如
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
呢?为什么不简单地询问属性是否不等于nullisBlank()
不是用来检查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;
}
}