检查 Optional 和 return String Java Stream API 中是否存在 null 属性

Check if null attribute present in Optional and return String Java Stream API

我有以下

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"。我正在考虑添加一种验证方法,但我确信有一种我想不到的更简单的方法。

您可以为此使用过滤器:

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");
}

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

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

这意味着,如果姓氏和名字不为空,则创建您的连接,否则 return 一条无效消息,或者您甚至可以使用 orElseThrow[=14= 抛出异常]

另一种函数式方法。

首先为必填字段验证创建谓词生成器方法:

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");