我有一个UserProfile
类,其中包含用户数据,如下所示:
class UserProfile {
private String userId;
private String displayName;
private String loginId;
private String role;
private String orgId;
private String email;
private String contactNumber;
private Integer age;
private String address;
// few more fields ...
// getter and setter
}
我需要计算非null
字段,以显示配置文件中用户填充的百分比。此外,还有一些字段我不想在百分比计算中考虑,如:x一米二氮一x、x一米三氮一x和x一米四氮一x。
一个简单的方法是使用多个If
语句来获取非空字段count
,但这会涉及到大量的代码,而且还有另一个类Organization
,我也需要显示它的完成百分比,所以我创建了一个实用函数,如下所示:
public static <T, U> int getNotNullFieldCount(T t,
List<Function<? super T, ? extends U>> functionList) {
int count = 0;
for (Function<? super T, ? extends U> function : functionList) {
count += Optional.of(t).map(obj -> function.apply(t) != null ? 1 : 0).get();
}
return count;
}
然后调用这个函数,如下所示:
List<Function<? super UserProfile, ? extends Object>> functionList = new ArrayList<>();
functionList.add(UserProfile::getAge);
functionList.add(UserProfile::getAddress);
functionList.add(UserProfile::getEmail);
functionList.add(UserProfile::getContactNumber);
System.out.println(getNotNullFieldCount(userProfile, functionList));
我的问题是,这是不是我可以计算非null
字段的最好方法,或者我可以进一步改进它。请提出建议。
2条答案
按热度按时间lyr7nygr1#
你可以通过在给定的函数列表上创建一个流来简化你的代码:
这将返回每个函数返回的非
null
字段的计数。每个函数被Map到将其应用于给定对象的结果,并且null
字段被 predicateObjects::nonNull
过滤掉。bzzcjhmw2#
我写了一些实用方法来获取对象中可读属性的总数和非空值的计数。完成百分比可以基于这些来计算。
它应该可以很好地处理继承属性和嵌套对象。
不过,我没有添加忽略某些属性的逻辑。
下面是实用程序类:
下面是一些测试: