检查Optional中是否存在null属性,并返回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"。我想添加一种验证方法,但我相信有一种更简单的方法我想不出来。

您正在查找Optional::filter,在映射之前:

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

这意味着,如果家族和名字不为空,那么创建连接,否则返回Invalid消息,或者您甚至可以使用orElseThrow抛出异常

您可以使用过滤器:

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

另一种功能性方法。

首先为所需字段验证创建一个谓词生成器方法:

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

最新更新