我有以下
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");