【问题标题】:Unbox value from Either<L, R> vavr从 Either<L, R> vavr 拆箱值
【发布时间】:2019-06-06 05:02:04
【问题描述】:

背景

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

我的目标是在管道中执行一系列操作,并使用 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,但即使该方法也返回了 Right。

问题

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

【问题讨论】:

    标签: java functional-programming monads either vavr


    【解决方案1】:

    使用flatMap(either_double) 而不是map(either_double)

    【讨论】:

    • 我仍然得到一个错误:“方法 flatmap(Function>) 未定义类型 Either"
    • Either.right(2f)Either.&lt;String, Float&gt;right(2f))明确类型
    • 导致另一个错误:“方法 flatmap(Function>) 对于 Either 类型未定义。我是否缺少一些连接地图和平面地图的操作?
    • MflatMap的大写
    • 啊,我是正式的白痴。好检查!您可以将显式类型添加到您的答案中吗?无论如何,我仍然会接受它,但它会成为未来的读者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2019-05-08
    • 2012-07-27
    • 2014-11-25
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多