Java8 - 基于一个POJO更新多个列表

Java8 - update more than one list based on a POJO

我有一个用例如下。

  1. POJO
  2. 如果 POJO 不为 null 且不为空,则将 pojo 添加到集合中。
  3. 将 pojo 中的一个元素添加到另一组中
  4. 从 pojo 添加另一个元素到列表

我有如下内容。

Optional.ofNullable(pojo)
        .ifPresent(uniquePojoSet::add) //Added pojo to a set
        .//Add city from pojo to a set
        .//Add userName from pojo to a list 

这里,ifPresentreturnsvoid。我不确定如何处理?只有当元素不为 null 且不为空时,我才需要添加。

也请建议写成标准。

当前实施:

if(pojo != null && !pojo.isEmpty()) {
  //Add Pojo to set
  if(pojo.getProperty1() != null) {
   //Add to another set
  }
  if(pojo.getProperty2() != null) {
   //Add to another list
  }
}

我推荐了this但是不能完全符合我的要求

由于 Optional 是一个值 - class 并且不可变,您可以存储直接步骤并执行:

Optional<Pojo> notEmpty = Optional.ofNullable(pojo).filter(pojo -> !pojo.isEmpty());
notEmpty.ifPresent(uniquePojoSet::add);
notEmpty.map(Pojo::getCity).ifPresent(citySet::add);
notEmpty.map(Pojo::getUserName).ifPresent(userNameSet::add);

我认为更具可读性的方法是简单的 if 级联。

您提到的文章建议将 POJO 字段转换为 Optionals。另一种选择是使吸气剂 return Optionals,例如:

public class Pojo {

    private String city;
    private String username;

    public Optional<String> getCity() {
        return Optional.ofNullable(city);
    }

    public Optional<String> getUsername() {
        return Optional.ofNullable(username);
    }
}

然后您可以按如下方式使用它们:

Optional.ofNullable(pojo).ifPresent(p -> {
    uniquePojoSet.add(p);
    p.getCity().ifPresent(cities::add);
    p.getUsername().ifPresent(usernames::add);
});