从Either <l,r =“”> vavr取消装箱值

时间:2019-01-11 09:32:13

标签: java functional-programming monads either vavr

背景

我有一个小函数可以返回Either<String, Float>。如果成功,则返回浮点数,否则返回错误字符串。

我的目标是在管道中执行一系列操作,并使用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的right,然后对其进行递增,然后将其加倍。这些操作的结果为6。

问题

数学运算的结果是6.0f,但这不是我得到的。相反,我得到Right(6.0f)

这是一个阻止代码编译的问题。我在Either Monad中都有一个 boxed 值,但是在检查了它们的API for Either之后,我没有找到一种方法来拆箱并按原样获取值

我曾考虑过使用getOrElseGet,但即使该方法也会返回Right。

问题

如何访问存储在任一Monad中的实际值?

1 个答案:

答案 0 :(得分:2)

使用flatMap(either_double)代替map(either_double)