我有一个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
字段,以显示用户填充了多少百分比的个人资料。此外,我不想在百分比计算中考虑几个字段,例如:userId
,loginId
和displayName
。
简单的方法是使用多个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
字段的最佳方法,或者我可以进一步改进它。请建议。
答案 0 :(得分:7)
您可以通过在给定的函数列表上创建Stream来简单地编写代码:
public static <T> long getNonNullFieldCount(T t, List<Function<? super T, ?>> functionList) {
return functionList.stream().map(f -> f.apply(t)).filter(Objects::nonNull).count();
}
这将返回每个函数返回的非null
字段的计数。每个函数都映射到将其应用于给定对象的结果,并使用谓词Objects::nonNull
过滤掉null
个字段。