javalambdaoption-type

Java 8 optional: ifPresent return object orElseThrow exception


I'm trying to make something like this:

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

This won't work, because ifPresent takes Consumer functional interface as parameter, which has void accept(T t). It cannot return any value. Is there any other way to do it ?


Solution

  • Actually what you are searching is: Optional.map. Your code would then look like:

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

    I would rather omit passing the Optional if you can. In the end you gain nothing using an Optional here. A slightly other variant:

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

    If you already have the Optional-object due to another call, I would still recommend you to use the map-method, instead of isPresent, etc. for the single reason, that I find it more readable (clearly a subjective decision ;-)).