J'ai le
public String getFullName(Optional<Person> persons) { return persons .map(person -> (person.getFirstName() + " " + person.getFamilyName())).orElse("Invalid"); }
Et j'ai la méthode suivante
class Person private String firstName; private String familyName; // Setters and Getters
Je veux juste vérifier si le prénom ou le nom est null
, affichez "Invalid"
pour cette personne. Je pensais ajouter une méthode de validation mais je suis sûr qu'il existe un moyen plus simple auquel je ne peux pas penser.
3 Réponses :
Vous pouvez utiliser le filtre pour cela:
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"); }
Vous recherchez Facultatif :: filter
, avant la carte:
return persons .filter(person -> person.getFamilyName() != null && person.getFirstName() != null) .map(person -> person.getFirstName() + " " + person.getFamilyName()) .orElse("Invalid");
Ce qui signifie, si la famille et les prénoms ne sont pas nuls alors créez votre concatination, sinon renvoyez un message invalide, ou vous pouvez même lever une exception en utilisant ouElseThrow
Une autre approche fonctionnelle.
Commencez par créer une méthode de création de prédicat pour la validation des champs obligatoires:
Person person = ... String fullName = getFullName(person).orElse("Invalid");
Et modifiez un peu le 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()); }
Ensuite, utilisez-le comme suit:
public static <T, F> Predicate<T> hasRequiredValue(Function<T, F> fieldGetter) { return fieldGetter.andThen(Objects::nonNull)::apply; }
Passer
Facultatif
en tant que paramètre n'est pas une bonne idée. à la place, il serait préférable d'avoirOptional
pour la méthode. quelque chose comme ceci:Optional getFullName (Person person) {if (person.getFamilyName () == null && person.getFirstName () == null) return Optional.empty (); return Facultatif.of (person.getFirstName () + "" + person.getFamilyName ()); }
@HadiJ Bon point. J'ai également pensé à cela après avoir répondu à la question. Les développeurs ne peuvent pas s'habituer à l'objectif initial de
Facultatif
, qui est un moyen sûr de renvoyer une valeur Nullable. AvoirFacultatif
comme paramètre de méthode enfreint un peu ce principe.