我有一个Java-8类:
class MyClass{
double field1;
double field2;
int field3;
...
float fieldN;
boolean isEmpty() {
// I want to implement this such that if all my numeric fields are 0's then return true else false
}
}
实现isEmpty()而不是在其中添加许多不同的if(fieldX == 0)条件是最优雅的方法吗?
答案 0 :(得分:2)
YMMV关于您是否发现它“优雅”,但是可以使用DoubleStream
:
boolean isEmpty() {
return DoubleStream.of(field1, field2, field3)
.allMatch(f -> f == 0);
}
答案 1 :(得分:2)
如果您不想声明每个字段,否则可以使用反射和流过滤器
public boolean isEmpty() throws IllegalAccessException {
Field[] valueObjFields = this.getClass().getDeclaredFields();
Object _this=this;
return Arrays.stream(valueObjFields).allMatch(o -> {
try {
return Double.parseDouble(o.get(_this).toString())== 0;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return false;
});
}
如果所有字段为空,并且您不必分别检查每个字段,则此方法返回true。
即使您在类中添加了更多字段,该方法也可以正常运行。
答案 2 :(得分:1)
最优雅的方法是使用JSR 380 bean validation。
这是一组工具,包括useful common annotations,用于定义bean类元数据以进行约束验证。
您无需阅读完整的规范即可了解其要点:
您要为此一组特定的约束定义一个组类
.then
然后用
注释每个相关字段public interface MyCustomIsEmpty{}
确保使用@Max(value = 0, groups = { MyCustomIsEmpty.class })
@Min(value = 0, groups = { MyCustomIsEmpty.class })
注释类。
现在,您实际的isEmpty()就像获取默认验证器并验证当前实例一样简单:
javax.validation.constraints
您可以将两个组合注释的等效项简化为一个自定义注释,以减少冗长。规范中对此进行了介绍。
答案 3 :(得分:0)
您可以使用通用列表之类的方法,将值添加到该列表中并进行迭代。
List<Object> field = new List<Object>
或使用Number
代替Object。
然后,您的isEmpty()可能如下所示:
boolean isEmpty() {
for (Object o : field) {
if (o == 0) return false;
return true;
}