Java:找出对象的所有数字字段是否均为0

时间:2018-08-28 11:02:26

标签: java algorithm if-statement

我有一个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)条件是最优雅的方法吗?

4 个答案:

答案 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;
}