Mam następujące

class Person
  private String firstName;
  private String familyName;

  // Setters and Getters

Mam następującą metodę

public String getFullName(Optional<Person> persons) {
  return persons
           .map(person -> (person.getFirstName() + " " + person.getFamilyName())).orElse("Invalid");
}

Chcę tylko sprawdzić, czy imię lub nazwisko to null, wyświetl "Invalid" dla tej osoby. Myślałem o dodaniu metody walidacji, ale jestem pewien, że istnieje łatwiejszy sposób, o którym nie mogę myśleć.

1
user12051965 3 kwiecień 2020, 19:50

3 odpowiedzi

Najlepsza odpowiedź

Szukasz Optional::filter, przed mapą:

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

Co oznacza, że jeśli rodzina i imiona nie są puste, utwórz konkatenację, w przeciwnym razie zwróć nieprawidłową wiadomość lub możesz nawet zgłosić wyjątek za pomocą orElseThrow

3
YCF_L 3 kwiecień 2020, 16:54

Inne podejście funkcjonalne.

Najpierw utwórz metodę konstruktora predykatów do weryfikacji wymaganego pola:

public static <T, F> Predicate<T> hasRequiredValue(Function<T, F> fieldGetter) {
    return fieldGetter.andThen(Objects::nonNull)::apply;
}

I trochę zmodyfikuj 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());
}

Następnie użyj go w następujący sposób:

Person person = ...
String fullName = getFullName(person).orElse("Invalid");
1
ETO 3 kwiecień 2020, 19:22

Możesz użyć do tego filtra:

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
Andronicus 3 kwiecień 2020, 16:53