首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Vavr合并吗?

在Vavr合并吗?
EN

Stack Overflow用户
提问于 2020-01-09 09:39:38
回答 1查看 2.6K关注 0票数 7

我有几个瓦沃尔 任一,我想为每个函数调用一个具有Right值的函数。

代码语言:javascript
复制
Either<MyError, String> either1 = ..
Either<MyError, String> either2 = ..
Either<MyError, String> either3 = ..

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

我当然可以这样做:

代码语言:javascript
复制
either1.flatMap { value1 ->
    either2.flatMap { value2 ->
        either3.flatMap { value3 ->
            methodRequiringAllInputs(value1, value2, value3);
        }
    }
}

但这很难看。在其他语言中,你只需使用类似do-表示法或理解的东西就可以使结构变平。我知道Vavr有一个验证的概念,它是一个应用程序函子,允许您这样做:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-09 13:14:38

vavr中有一个用于理解的结构,您可以在用例中使用它。它帮助您将多个IterableOptionTryFutureList实例分别转换为另一个IteratorOptionTryFutureList实例,方法是将它们(作为笛卡尔产品的行)组合成结果值。

在您的示例中,Either是正确值的Iterable,您可以使用IterableFor构造来构造String权限值的Tuple3,并通过调用副作用代码或以任何您想要的方式映射/转换代码来迭代生成的Iterator。您将拥有一个丰富的vavr Iterator,因此这比简单的JDK Iterator灵活得多。

代码语言:javascript
复制
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,因为只有在迭代生成的Iterator时才会(懒惰地)执行yield部分。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59661039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档