检查可选和返回字符串Java Stream API中是否存在null属性

检查可选和返回字符串Java Stream API中是否存在null属性,java,java-8,functional-programming,java-stream,optional,Java,Java 8,Functional Programming,Java Stream,Optional,我有以下几点 class Person private String firstName; private String familyName; // Setters and Getters 我有下面的方法 public String getFullName(Optional<Person> persons) { return persons .map(person -> (person.getFirstName() + " " +

我有以下几点

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");
}
公共字符串getFullName(可选人员){
返回人员
.map(person->(person.getFirstName()+“”+person.getFamilyName()).orElse(“无效”);
}

我只想检查名字或姓氏是否为
null
,为此人显示
“无效”
。我想添加一种验证方法,但我确信有一种更简单的方法我想不出来。

您可以使用过滤器:

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");
}
公共字符串getFullName(可选人员){
返回人员
.filter(person->Objects.nonNull(person.getFirstName())和&Objects.nonNull(person.getFamilyName())
.map(person->(person.getFirstName()+“”+person.getFamilyName()).orElse(“无效”);
}

您可以使用过滤器:

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");
}
公共字符串getFullName(可选人员){
返回人员
.filter(person->Objects.nonNull(person.getFirstName())和&Objects.nonNull(person.getFamilyName())
.map(person->(person.getFirstName()+“”+person.getFamilyName()).orElse(“无效”);
}
您要查看的内容,在地图之前:

return persons
        .filter(person -> person.getFamilyName() != null && person.getFirstName() != null)
        .map(person -> person.getFirstName() + " " + person.getFamilyName())
        .orElse("Invalid");
这意味着,如果族和名字不为null,则创建您的concatation,否则返回无效消息,或者您甚至可以在映射之前使用您要查看的
或lsetrow
引发异常:

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

这意味着,如果族和名字不为null,则创建您的concatation,否则返回无效消息,或者您甚至可以使用另一种功能方法抛出异常

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

public static <T, F> Predicate<T> hasRequiredValue(Function<T, F> fieldGetter) {
    return fieldGetter.andThen(Objects::nonNull)::apply;
}
然后按如下方式使用:

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

另一种功能性方法

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

public static <T, F> Predicate<T> hasRequiredValue(Function<T, F> fieldGetter) {
    return fieldGetter.andThen(Objects::nonNull)::apply;
}
然后按如下方式使用:

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

Optional
作为参数传递不是一个好主意。相反,对于该方法使用
可选
会更好。类似这样的内容:
Optional getFullName(Person-Person){if(Person.getFamilyName()==null&&Person.getFirstName()==null)返回Optional.empty();返回Optional.of(Person.getFirstName()+“”+Person.getFamilyName());}
@HadiJ很好。在回答问题后,我也想到了这一点。开发人员无法习惯
Optional
的最初目的,因为这是返回可为空值的安全方法。将
Optional
作为方法参数有点违反这一原则。将
Optional
作为参数传递不是一个好主意。相反,对于该方法使用
可选
会更好。类似这样的内容:
Optional getFullName(Person-Person){if(Person.getFamilyName()==null&&Person.getFirstName()==null)返回Optional.empty();返回Optional.of(Person.getFirstName()+“”+Person.getFamilyName());}
@HadiJ很好。在回答问题后,我也想到了这一点。开发人员无法习惯
Optional
的最初目的,因为这是返回可为空值的安全方法。将
作为可选的
作为方法参数有点违反这一原则。