web-dev-qa-db-fra.com

Java 8 facultatif: objet ifPresent return ou exception ElseThrow

J'essaie de faire quelque chose comme ça:

 private String getStringIfObjectIsPresent(Optional<Object> object){
        object.ifPresent(() ->{
            String result = "result";
            //some logic with result and return it
            return result;
        }).orElseThrow(MyCustomException::new);
    }

Cela ne fonctionnera pas, car ifPresent prend l’interface fonctionnelle Consumer en tant que paramètre, qui a void accept (T t). Il ne peut retourner aucune valeur. Y a-t-il un autre moyen de le faire?

23
RichardK

En fait, ce que vous recherchez est: Facultatif.map . Votre code ressemblerait alors à:

object.map(o -> "result" /* or your function */)
      .orElseThrow(MyCustomException::new);

Je préférerais ne pas passer le Optional si vous le pouvez. En fin de compte, vous ne gagnez rien en utilisant un Optional ici. Une variante légèrement différente:

public String getString(Object yourObject) {
  if (Objects.isNull(yourObject)) { // or use requireNonNull instead if NullPointerException suffices
     throw new MyCustomException();
  }
  String result = ...
  // your string mapping function
  return result;
}

Si vous avez déjà l'objet Optional- en raison d'un autre appel, je vous recommanderais quand même d'utiliser la méthode map- au lieu de isPresent, etc. pour la seule raison , que je le trouve plus lisible (clairement une décision subjective ;-)).

31
Roland

Je préférerais la cartographie après m'être assuré que la valeur est disponible

private String getStringIfObjectIsPresent(Optional<Object> object) {
   Object ob = object.orElseThrow(MyCustomException::new);
    // do your mapping with ob
   String result = your-map-function(ob);
  return result;
}

ou une doublure

private String getStringIfObjectIsPresent(Optional<Object> object) {
   return your-map-function(object.orElseThrow(MyCustomException::new));
}
12
iamiddy

Utilisez plutôt la fonction map-. Il transforme la valeur à l'intérieur de l'option.

Comme ça:

private String getStringIfObjectIsPresent(Optional<Object> object) {
    return object.map(() -> {
        String result = "result";
        //some logic with result and return it
        return result;
    }).orElseThrow(MyCustomException::new);
}
8
marstran

Deux options ici:

Remplacez ifPresent par map et utilisez Function au lieu de Consumer

private String getStringIfObjectIsPresent(Optional<Object> object) {
    return object
            .map(obj -> {
                String result = "result";
                //some logic with result and return it
                return result;
            })
            .orElseThrow(MyCustomException::new);
}

Utilisez isPresent:

private String getStringIfObjectIsPresent(Optional<Object> object) {
    if (object.isPresent()) {
        String result = "result";
        //some logic with result and return it
        return result;
    } else {
        throw new MyCustomException();
    }
}
6
Vlad Bochenin