Как получить либо влево / вправо в зависимости от значения параметра - PullRequest
1 голос
/ 09 июня 2019

Я пытаюсь вернуть значение Either в зависимости от значения параметра. Моя цель - вернуть Either.right (), если опция присутствует в противном случае, код должен вернуть Either.left (). Я использую Java 8 и vavr 0.9.2

Я хочу избежать условного употребления

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

ошибка компилятора с этим сообщением

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>>)

Ответы [ 2 ]

4 голосов
/ 09 июня 2019

orElse возвращает Option<T>, в то время как doSomething тип возврата требует Either<String, Integer>.

Вместо этого попробуйте использовать getOrElse, который возвращает T:

public Either<String, Integer> doSomething() {
    // ...
    return integerOption.map(
        Either::<String, Integer>right).getOrElse(
            () -> Either.left("Error message"));
}
0 голосов
/ 09 июня 2019

Поскольку вы хотите вернуть Either<...>, а не Option<Either<...>>, вы должны использовать getOrElse

...