【问题标题】:Count non null fields in an object计算对象中的非空字段
【发布时间】: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 字段以显示用户填写了多少百分比的配置文件。还有一些我不想在百分比计算中考虑的字段,例如: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 字段的最佳方法,还是我可以进一步改进它。请提出建议。

【问题讨论】:

  • 我认为这个问题可能更适合 CodeReview。但是您的解决方案看起来还不错。
  • 既然添加函数到列表中,不如创建一个简单的方法,逐个检查字段
  • @AdamSkywalker 你能提出一个更好的解决方案吗?
  • Optional 的这种用法没有任何意义……

标签: java java-8


【解决方案1】:

您可以通过在给定的函数列表上创建一个 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 字段。

【讨论】:

  • @Tom 哦,对了,我没有注意到并进行了编辑。谢谢!
  • @Tom:这仅反映了问题本身的不一致,标题中有“Count null fields”,但正文中有“count non null fields”。
  • @Holger 感谢您指出这一点,我已经更新了问题标题。
  • 当然,你可以直接写.filter(f -&gt; f.apply(t)!=null),而不是.map(f -&gt; f.apply(t)).filter(Objects::nonNull),但这只是个人喜好问题。
猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2018-06-20
  • 2011-03-24
相关资源
最近更新 更多