java - 如何使用java动态计算模型中空字段的计数
问题描述
如何计算个人资料完成百分比?参考下面的 Profile 模型文件,每个属性是另一个模型(例如:BasicInfo 有大约 15 个元素,需要计算这个,然后最后将这个计数添加到 Profile 总计数中)。我需要动态获取 BasicInfo 计数,而不需要为所有字段添加 if 条件检查。参考下面的代码
逻辑:
- 每个属性的权重为 1
- Profile中有13个元素
- 每个属性都有很多元素(假设 BasicInfo 有 15 个,用户填写了 10 个),那么您应该返回 10/15 = 0.67
- 然后将所有属性相加并除以 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;
}
解决方案
你试过反射吗?您可以获得一个类的所有声明字段。我按照您的要求编写了一个小方法来过滤空值
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
推荐阅读
- rust - 如何固定 RefCell 内容?
- visual-studio - 使用 Web 内容自定义 VSTS Wiki
- asp.net - ASP.NET Core Razor Pages 项目 - 已检测到不适用于集成托管管道模式的 ASP.NET 设置
- python - 不使用元组的多索引列的 set_index
- c - 在C中参考命名的结构成员直接初始化或分配变量数组的结构成员?
- javascript - 为什么没有将类添加到加载的导航元素?
- javascript - 如何在 Gutenberg 中使用序列化数据?
- sql-server - 将 case 语句切换为常量会大大降低查询速度
- visual-studio - 为什么 .NET Core 3.1 在我安装后没有出现在 Visual Studio 中?
- c# - 用于 Sharepoint 搜索文档身份验证问题的 C# REST API