代码之家  ›  专栏  ›  技术社区  ›  Flame_Phoenix

从<l,r>vavr中取下值

  •  1
  • Flame_Phoenix  · 技术社区  · 6 年前

    背景

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

    我的目标是在管道中执行一系列操作,并使用其中一种实现面向铁路的编程。

    代码

    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.0华氏度,但这不是我得到的结果。取而代之的是我得到 Right(6.0f) .

    这是一个阻止代码编译的问题。我有一个价值 装箱的 在任何一个Monad中,但是在检查完 API for Either 我找不到一种方法来解开它并获取值 .

    我想用 getOrElseGet 但即使该方法也返回一个右键。

    问题

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

    1 回复  |  直到 6 年前
        1
  •  2
  •   talex    6 年前

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

    推荐文章