【发布时间】:2016-04-28 11:11:17
【问题描述】:
我有一个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 字段的最佳方法,还是我可以进一步改进它。请提出建议。
【问题讨论】:
-
我认为这个问题可能更适合 CodeReview。但是您的解决方案看起来还不错。
-
既然添加函数到列表中,不如创建一个简单的方法,逐个检查字段
-
@AdamSkywalker 你能提出一个更好的解决方案吗?
-
Optional的这种用法没有任何意义……