【问题标题】:Check if null attribute present in Optional and return String Java Stream API检查 Optional 中是否存在 null 属性并返回 String Java Stream API
【发布时间】:2020-07-15 21:45:47
【问题描述】:

我有以下

class Person
  private String firstName;
  private String familyName;

  // Setters and Getters

我有以下方法

public String getFullName(Optional<Person> persons) {
  return persons
           .map(person -> (person.getFirstName() + " " + person.getFamilyName())).orElse("Invalid");
}

我只想检查名字或姓氏是否是null,为那个人显示"Invalid"。我正在考虑添加一种验证方法,但我确信有一种更简单的方法我想不出。

【问题讨论】:

  • Optional 作为参数传递不是一个好主意。相反,为该方法使用Optional&lt;String&gt; 会更好。像这样:Optional&lt;String&gt; getFullName(Person person) { if (person.getFamilyName() == null &amp;&amp; person.getFirstName() == null) return Optional.empty(); return Optional.of(person.getFirstName() + " " + person.getFamilyName()); }
  • @HadiJ 好点。回答完问题后也想到了。开发人员无法习惯 Optional 的最初用途,它是一种返回可为空值的安全方式。将Optional 作为方法参数有点违反这个原则。

标签: java java-8 functional-programming java-stream optional


【解决方案1】:

您正在寻找Optional::filter,在地图之前:

return persons
        .filter(person -> person.getFamilyName() != null && person.getFirstName() != null)
        .map(person -> person.getFirstName() + " " + person.getFamilyName())
        .orElse("Invalid");

这意味着,如果姓氏和名字不为空,则创建您的连接,否则返回无效消息,或者您甚至可以使用 orElseThrow 引发异常

【讨论】:

    【解决方案2】:

    您可以为此使用过滤器:

    public String getFullName(Optional<Person> persons) {
      return persons
               .filter(person -> Objects.nonNull(person.getFirstName()) && Objects.nonNull(person.getFamilyName()))
               .map(person -> (person.getFirstName() + " " + person.getFamilyName())).orElse("Invalid");
    }
    

    【讨论】:

      【解决方案3】:

      另一种功能方法。

      首先为必填字段验证创建一个谓词构建器方法:

      public static <T, F> Predicate<T> hasRequiredValue(Function<T, F> fieldGetter) {
          return fieldGetter.andThen(Objects::nonNull)::apply;
      }
      

      并稍微修改getFullName

      public Optional<String> getFullName(Person person) {
          return Optional.ofNullable(person)
                         .filter(hasRequiredValue(Person::getFamilyName))
                         .filter(hasRequiredValue(Person::getFirstName))
                         .map(p -> p.getFirstName() + " " + p.getFamilyName());
      }
      

      然后按如下方式使用:

      Person person = ...
      String fullName = getFullName(person).orElse("Invalid");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-17
        • 2017-12-29
        • 1970-01-01
        • 2022-07-07
        • 1970-01-01
        • 2020-01-14
        相关资源
        最近更新 更多