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?
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 ;-)).
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));
}
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);
}
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();
}
}