1
votes

Vérifiez si l'attribut nul est présent dans facultatif et renvoyez l'API de flux Java String

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.


2 commentaires

Passer Facultatif en tant que paramètre n'est pas une bonne idée. à la place, il serait préférable d'avoir Optional 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. Avoir Facultatif comme paramètre de méthode enfreint un peu ce principe.


3 Réponses :


1
votes

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


0 commentaires

3
votes

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


0 commentaires

1
votes

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;
}


0 commentaires