【问题标题】:How to get Either left/right depending of Option value如何根据选项值获得左/右
【发布时间】:2019-06-08 21:00:33
【问题描述】:

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

【问题讨论】:

    标签: java either vavr


    【解决方案1】:

    orElse 返回Option&lt;T&gt; 而doSomething 返回类型需要Either&lt;String, Integer&gt;。

    尝试使用返回T的getOrElse:

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

    【讨论】:

    • 感谢您的回答,但使用 getOrElse,无法推断 Either 它总是推断 Either 错误:(59, 17) java: 不兼容的类型: io .vavr.control.Either 无法转换为 io.vavr.control.Either
    • 是的,这就是为什么您需要提供显式类型参数:Either::&lt;String, Integer&gt;right,无论是getOrElse 还是orElse。
    • 我相信它在 java 中被称为 orElseGet,而不是 getOrElse ;)
    • @Klesun 不,因为它是vavr api method。
    【解决方案2】:

    由于您想返回Either&lt;...&gt; 而不是Option&lt;Either&lt;...&gt;&gt;,您必须使用getOrElse

    【讨论】:

      【解决方案3】:

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

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

      更新:虽然它似乎并不总是很遗憾地推断出它自己的泛型。

      【讨论】:

        【解决方案4】:

        对我有用

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-17
          • 2012-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多