从 Either<L, R> vavr 拆箱值
Unbox value from Either<L, R> vavr
背景
我有一个小功能可以returnEither<String, Float>
。如果成功,它 return 是一个浮点数,否则是一个错误字符串。
我的objective是在pipeline中进行一系列操作,使用Either实现面向铁路的编程
代码
import java.util.function.Function;
import io.vavr.control.Either;
@Test
public void run(){
Function<Float, Either<String, Float>> either_double = num -> {
if(num == 4.0f)
Either.left("I don't like this number");
return Either.right(num * 2);
};
Function<Float, Float> incr = x -> x + 1.0f;
Float actual =
Either.right(2f)
.map(incr)
.map(either_double)
.get();
Float expected = 6.0f;
assertEquals(expected, actual);
}
这段代码做了一系列简单的操作。首先,我创建了一个值为 2 的右值,然后递增它,最后将它加倍。这些操作的结果是 6。
问题
数学运算的结果是 6.0f,但这不是我得到的。相反,我得到 Right(6.0f)
。
这是一个阻止代码编译的问题。我在 Either Monad 中有一个值 boxed,但是在检查了它们的 API for Either 之后,我没有找到一种方法来拆箱并按原样获取值 。
我考虑过使用 getOrElseGet
,但即使是那种方法 return 也是正确的。
问题
如何访问 Either Monad 中存储的实际值?
使用 flatMap(either_double)
代替 map(either_double)
。
背景
我有一个小功能可以returnEither<String, Float>
。如果成功,它 return 是一个浮点数,否则是一个错误字符串。
我的objective是在pipeline中进行一系列操作,使用Either实现面向铁路的编程
代码
import java.util.function.Function;
import io.vavr.control.Either;
@Test
public void run(){
Function<Float, Either<String, Float>> either_double = num -> {
if(num == 4.0f)
Either.left("I don't like this number");
return Either.right(num * 2);
};
Function<Float, Float> incr = x -> x + 1.0f;
Float actual =
Either.right(2f)
.map(incr)
.map(either_double)
.get();
Float expected = 6.0f;
assertEquals(expected, actual);
}
这段代码做了一系列简单的操作。首先,我创建了一个值为 2 的右值,然后递增它,最后将它加倍。这些操作的结果是 6。
问题
数学运算的结果是 6.0f,但这不是我得到的。相反,我得到 Right(6.0f)
。
这是一个阻止代码编译的问题。我在 Either Monad 中有一个值 boxed,但是在检查了它们的 API for Either 之后,我没有找到一种方法来拆箱并按原样获取值 。
我考虑过使用 getOrElseGet
,但即使是那种方法 return 也是正确的。
问题
如何访问 Either Monad 中存储的实际值?
使用 flatMap(either_double)
代替 map(either_double)
。