gpt4 book ai didi

java - 在 Vavr 中结合任一者?

转载 作者:行者123 更新时间:2023-12-02 09:19:06 26 4
gpt4 key购买 nike

我有几个Vavr Either ',我想为每个 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 表示法或推导式之类的东西来扁平化结构。我知道 Vavr 有 Validation 的概念这是一个应用仿函数,允许您执行以下操作:

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

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

这要好得多。

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

最佳答案

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

在您的情况下,Eitherright 值上的 Iterable,您可以使用 For 构造让 Iterable 构造 String 右值的 Tuple3,并通过调用您的方法迭代生成的 Iterator副作用代码,或以您想要的任何方式映射/转换它们。您将拥有一个丰富 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

关于java - 在 Vavr 中结合任一者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59661039/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com