如何根据选项值获得 Either left/right
How to get Either left/right depending of Option value
我正在尝试根据选项值 return Either
值。如果选项存在,我的目标是 return Either.right() 否则,代码应该 return 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>>)
orElse
returns Option<T>
而 doSomething
return 类型需要 Either<String, Integer>
.
相反,尝试使用 getOrElse
which returns T
:
public Either<String, Integer> doSomething() {
// ...
return integerOption.map(
Either::<String, Integer>right).getOrElse(
() -> Either.left("Error message"));
}
因为你想 return Either<...>
而不是 Option<Either<...>>
你必须使用 getOrElse
我认为@oleksandr-pyrohov 的回答中的冗余泛型和格式让事情变得有点复杂。我只是这样写:
public Either<String, Integer> doSomething() {
// ...
return integerOption
.map(Either::right)
.orElseGet(() -> Either.left("Error message"));
}
更新:虽然它似乎并不总是可悲地自行推断泛型。
对我有用
public Either<String, Integer> doSomething() {
// ...
return integerOption
.<Either<String, Integer>>map(Either::right)
.orElseGet(() -> Either.left("Error message"));
}
我正在尝试根据选项值 return Either
值。如果选项存在,我的目标是 return Either.right() 否则,代码应该 return 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>>)
orElse
returns Option<T>
而 doSomething
return 类型需要 Either<String, Integer>
.
相反,尝试使用 getOrElse
which returns T
:
public Either<String, Integer> doSomething() {
// ...
return integerOption.map(
Either::<String, Integer>right).getOrElse(
() -> Either.left("Error message"));
}
因为你想 return Either<...>
而不是 Option<Either<...>>
你必须使用 getOrElse
我认为@oleksandr-pyrohov 的回答中的冗余泛型和格式让事情变得有点复杂。我只是这样写:
public Either<String, Integer> doSomething() {
// ...
return integerOption
.map(Either::right)
.orElseGet(() -> Either.left("Error message"));
}
更新:虽然它似乎并不总是可悲地自行推断泛型。
对我有用
public Either<String, Integer> doSomething() {
// ...
return integerOption
.<Either<String, Integer>>map(Either::right)
.orElseGet(() -> Either.left("Error message"));
}