计算对象中的非空字段

时间:2016-04-28 11:11:18

标签: java java-8

我有一个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字段,以显示用户填充了多少百分比的个人资料。此外,我不想在百分比计算中考虑几个字段,例如:userIdloginIddisplayName

简单的方法是使用多个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字段的最佳方法,或者我可以进一步改进它。请建议。

1 个答案:

答案 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个字段。