首页 > 解决方案 > 如何使用java动态计算模型中空字段的计数

问题描述

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

逻辑:

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

// 模型样本

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

标签: java

解决方案


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

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());

    }

这是这段代码的输出

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

推荐阅读