如何根据Option值向左/向右获取

时间:2019-06-08 21:00:33

标签: java either vavr

我试图根据选项值返回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>>)

3 个答案:

答案 0 :(得分:4)

orElse返回Option<T>,而doSomething返回类型要求Either<String, Integer>

相反,请尝试使用返回getOrElse的{​​{1}}:

T

答案 1 :(得分:0)

由于您要返回PLtz80rG4U0K99mMxPLNFPhwBIKkvzx9x1而不是Either<...>,因此必须使用uploaded videos page from HRVY channel

答案 2 :(得分:0)

我认为@ oleksandr-pyrohov的答案中多余的泛型和格式会使事情变得有些复杂。我会这样写:

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

更新。:尽管似乎并不总是可悲地推断出泛型。