Chain optionals with void return type

Spring :

JDK 8:

I'm validating input request. Is there a way to nicely chain these optionals? Or some other way to make it look a bit nicer and get rid off too many if optional checks? kinda looks ugly.

In REST controller class:

{
   ...

   Optional<ResponseEntity<?>> operationError = requestValidator.handleOperationError(bodyParams, myHandler, serviceInstance, null);
    if( operationError.isPresent()){
        return operationError.get();
    }

    Optional<ResponseEntity<?>> otherError = requestValidator.checkRequestOther(serviceInstance, bodyParams, instanceAction);
    if( otherError.isPresent()){
        return otherError.get();
    }

    Optional<ResponseEntity<?>> someWeirdError = requestValidator.checksomeWeird(serviceInstance, instanceAction);
    if( someWeirdError.isPresent()){
        return someWeirdError.get();
    }

    Optional<ResponseEntity<?>> conflictError = requestValidator.conflictExists(instanceAction,serviceInstance);
    if( conflictError.isPresent()){
        return conflictError.get();
    }

   //If All fine start doing business logic
}
Benoit :

If you need a strict Java 8 solution, you can create an helper class:

public class OptionalHelper {

    public static <T> Optional<T> findFirstPresent(Supplier<Optional<T>>... optionals) {
        return Arrays.stream(optionals)
                .map(Supplier::get)
                .filter(Optional::isPresent)
                .findFirst()
                .orElse(Optional.empty());
    }
}

And use it like this:

    Optional<ResponseEntity<?>> validationError = OptionalHelper.findFirstPresent(
            () -> requestValidator.handleOperationError(bodyParams, myHandler, serviceInstance, null),
            () -> requestValidator.checkRequestOther(serviceInstance, bodyParams, instanceAction),
            () -> requestValidator.checkSomeWeird(serviceInstance, instanceAction),
            () -> requestValidator.conflictExists(instanceAction, serviceInstance));

    if (validationError.isPresent()) {
        return validationError.get();
    }

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=308619&siteId=1
Recommended