【问题标题】:Combining Either's in Vavr?在 Vavr 中结合 Either 的?
【发布时间】:2020-01-09 09:39:38
【问题描述】:

我有几个VavrEither,我想为每个Either 调用一个具有Right 值的函数。例如:

Either<MyError, String> either1 = ..
Either<MyError, String> either2 = ..
Either<MyError, String> either3 = ..

Either<MyError, String>> methodRequiringAllInputs(String, String, String) { 
..
}

我当然可以这样做:

either1.flatMap { value1 ->
    either2.flatMap { value2 ->
        either3.flatMap { value3 ->
            methodRequiringAllInputs(value1, value2, value3);
        }
    }
}

但这很丑。在其他语言中,您可以使用诸如 do-notation 或 for comprehension 之类的东西来展平结构。我知道 Vavr 有 Validation 的概念,它是一个应用函子,可以让你做:

Validation<MyError, String> validation1 = ..
Validation<MyError, String> validation2 = ..
Validation<MyError, String> validation3 = ..

Validation.combine(validation1, validation2, validation3)
          .ap((validationValue1,validationValue2,validationValue3) -> .. );  

这更好。

我的问题是,Vavr 中是否存在类似的东西来避免嵌套的 flatMap 结构?请注意,我不想Either 转换为Validation

【问题讨论】:

    标签: java functional-programming vavr


    【解决方案1】:

    在 vavr 中有一个 for comprehension 构造,您可以将其用于您的用例。它可以帮助您将多个IterableOptionTryFutureList 实例分别转换为另一个IteratorOptionTryFutureList 实例将它们(作为笛卡尔积的行)组合成结果值。

    在您的情况下,Eitherright 值上的 Iterable,您可以使用 For 构造 Iterables 来构造 Tuple3 的 @987654336 @正确的值,并通过调用您的副作用代码或以您想要的任何方式映射/转换它们来迭代生成的Iterator。您将拥有一个 rich vavr Iterator,因此这比简单的 JDK Iterator 灵活得多。

    import static io.vavr.API.For;
    
    For(either1, either2, either3)
        .yield(Tuple::of)
        .forEach(t -> methodRequiringAllInputs(t._1, t._2, t._3));
    

    一个小提示:在上述情况下,yield 的结果是一个懒惰评估的Iterator。这意味着您最终需要对其进行迭代才能执行效果,因此forEach 部分是必不可少的。您不能将有副作用的代码移动到yield 部分并跳过forEach,因为yield 部分只会(懒惰地)在生成的Iterator 被迭代时执行。

    【讨论】:

      猜你喜欢
      • 2019-06-06
      • 1970-01-01
      • 2019-05-08
      • 2020-06-16
      • 2022-07-25
      • 2019-10-09
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      相关资源
      最近更新 更多