繁体   English   中英

如何使用 java 从 model 动态计算 null 字段的计数

[英]How to calculate the count of null field from the model dynamically using java

如何计算个人资料完成百分比? 参考下面的 Profile model 文件,每个属性是另一个模型(例如:BasicInfo 有大约 15 个元素,需要计算这个,然后最后将这个计数添加到 Profile 总数中)。 我需要动态获取 BasicInfo 计数,而不需要为所有字段添加 if 条件检查。 参考下面的代码

逻辑:

  1. 每个属性的权重为 1
  2. Profile中有13个元素
  3. 每个属性都有很多元素(假设 BasicInfo 有 15 个,用户填写了 10 个),那么您应该返回 10/15 = 0.67
  4. 然后将所有属性相加并除以 13。

// model 样品

Profile.java

    private BasicInfo basicInfo;

    private ReligionInfo religionInfo;

    private LocationInfo locationInfo;

    private ProfessionalInfo professionalInfo;

    private FamilyInfo familyInfo;

    private LifestyleInfo lifestyleInfo;

    private Configuration configuration;

    private BasicPreferences basicPreferences;

    private ReligionPreferences religionPreferences;

    private LocationPreferences locationPreferences;

    private ProfessionalPreferences professionalPreferences;

// 我试过的

public long getProfileList(String id) {
   Profile profile = findById(id);
    int count = getBasicInfo(profile);
   
    
    return count;
    }
  
  private int getBasicInfo(Profile profile) {
      
        int counter = 0;
        if (ObjectUtils.isEmpty(profile.getBasicInfo().getBirthDate())) {
            counter++;
        }

        if (ObjectUtils.isEmpty(profile.getBasicInfo().getDobt())) {
            counter++;
        }
        
        return counter;
    }

你试过反射吗? 您可以获得 class 的所有声明字段。 我按照您的要求编写了一个小方法来过滤空值

import java.util.*;
import java.util.stream.*;
import java.lang.reflect.Field;

class Example {
   private String emptyField;
   private String emptyField2;
   private String nonNullField = "non null";
}

public class Main {

    static boolean isFieldNull(Field field, Object obj) {
        try {
            return Objects.isNull(field.get(obj));
        } catch(IllegalAccessException ignored) {
            return false;
        }
    }

    public static void main (String[] args) {
        Example main = new Example();
        Field[] fields = Example.class.getDeclaredFields();

        //For getting access to private fields
        Arrays.stream(fields).forEach(f -> f.setAccessible(true));

        System.out.println(Arrays.stream(fields)
            .filter(f -> isFieldNull(f, main))
            .count());

    }

这是此代码的 output

   java -classpath .:/run_dir/junit-4.12.jar:target/dependency/* Main
   2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM