Search code examples
javaeithervavr

How to get Either left/right depending of Option value


I'm trying to return Either value depending on option value. My goal is to return Either.right() if the option is present otherwise, the code should return Either.left(). I use Java 8 and vavr 0.9.2

I want to avoid conditional imbrication

public Either<String, Integer> doSomething() {
    Optional<Integer> optionalInteger = Optional.of(Integer.MIN_VALUE);
    Option<Integer> integerOption = Option.ofOptional(optionalInteger);

    return integerOption.map(value -> {
      //some other actions here
      return Either.right(value);
    }).orElse(() -> {
      //some other checks her also 
      return Either.left("Error message");
    });
}

the compiler fail with this message

Error:(58, 7) java: no suitable method found for orElse(()->Either[...]age"))
    method io.vavr.control.Option.orElse(io.vavr.control.Option<? extends io.vavr.control.Either<java.lang.Object,java.lang.Integer>>) is not applicable
      (argument mismatch; io.vavr.control.Option is not a functional interface
          multiple non-overriding abstract methods found in interface io.vavr.control.Option)
    method io.vavr.control.Option.orElse(java.util.function.Supplier<? extends io.vavr.control.Option<? extends io.vavr.control.Either<java.lang.Object,java.lang.Integer>>>) is not applicable
      (argument mismatch; bad return type in lambda expression
          no instance(s) of type variable(s) L,R exist so that io.vavr.control.Either<L,R> conforms to io.vavr.control.Option<? extends io.vavr.control.Either<java.lang.Object,java.lang.Integer>>)

Solution

  • orElse returns Option<T> while doSomething return type requires Either<String, Integer>.

    Instead, try to use getOrElse which returns T:

    public Either<String, Integer> doSomething() {
        // ...
        return integerOption.map(
            Either::<String, Integer>right).getOrElse(
                () -> Either.left("Error message"));
    }