Проверьте наличие нулевого атрибута в Optional и верните String Java Stream API - PullRequest
2 голосов
/ 03 апреля 2020

У меня есть следующее

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" для этого человека. Я думал добавить метод проверки, но уверен, что есть более простой способ, о котором я не могу думать.

Ответы [ 3 ]

4 голосов
/ 03 апреля 2020

Вы ищете Optional::filter перед картой:

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

Что означает, что если фамилия и имя не равны NULL, создайте конкатенацию, в противном случае верните Неверное сообщение, или вы даже можете вызвать исключение, используя orElseThrow

2 голосов
/ 03 апреля 2020

Для этого вы можете использовать фильтр:

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");
}
1 голос
/ 03 апреля 2020

Другой функциональный подход.

Сначала создайте метод построителя предикатов для обязательной проверки поля:

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