gpt4 book ai didi

java - 如何使用 Vavr 正确实现这一点?

转载 作者:行者123 更新时间:2023-11-30 05:49:54 27 4
gpt4 key购买 nike

我希望得到您关于如何以功能性方式正确编写此代码的建议:

private Option<CalcResult> calculate(Integer X, Integer Y) {
if (X < Y) return Option.none();
return Option.of( X + Y );
}

public Option<CalcResult> otherMethod(Obj o) {
if (o.getAttr()) {
// getA() & getB() are APIs out of my control and could return a null value
if (o.getA() != null && o.getB() != null) {
return calculate(o.getA(), o.getB());
}
}

return Option.none();
}

计算很简单:

private Option<CalcResult> calculate(Integer X, Integer Y) {
return Option.when(X > Y, () -> X + Y);
}

对于otherMethod,这是我的第一个方法:

public Option<CalcResult> otherMethod(Obj o) {
return Option.when(o.getAttr(), () ->
For(Option.of(o.getA()), Option.of(o.getB()))
.yield(this::calculate)
.toOption()
.flatMap(Function.identity())
).flatMap(Function.identity());
}

但是,与第一个版本相比,我觉得代码的可读性不如我预期(双 flatMap 让人很难理解,乍一看,为什么会在那里)

我尝试了另一个,这改善了讲座:

public Option<CalcResult> otherMethod(Obj o) {
return For(
Option.when(o.getAttr(), o::getAttr()),
Option.of(o.getA()),
Option.of(o.getB()))
.yield((__, x, y) -> this.calculate(x, y))
.toOption()
.flatMap(Function.identity());
}

它更具可读性,但我认为我在这种情况下没有正确使用 For-communion。

您对本案有何建议?我是否正确使用了 vavr 的 API?

谢谢

最佳答案

我会写calculate完全按照你的方式做(除了我永远不会使用大写参数:P)。

至于otherMethod ,我会使用模式匹配。 Vavr 中的模式匹配与 Haskell 等功能性语言中的 PM 相差甚远,但我认为它仍然正确地代表了您的意图:

public Option<Integer> otherMethod(Obj o) {
return Option.when(o.getAttr(), () -> Tuple(Option(o.getA()), Option(o.getB()))) //Option<Tuple2<Option<Integer>, Option<Integer>>>
.flatMap(ab -> Match(ab).option( // ab is a Tuple2<Option<Integer>, Option<Integer>>
Case($Tuple2($Some($()), $Some($())), () -> calculate(o.getA(), o.getB())) // Read this as "If the pair (A, B)" has the shape of 2 non-empty options, then calculate with what's inside
// Result of Match().option() is a Option<Option<Integer>>
).flatMap(identity())); // Option<Integer>
}

替代方案,不带注释(请注意,我们使用 Match().of() 而不是 Match().option() ,因此我们必须处理所有可能的形状):

public Option<Integer> otherMethod(Obj o) {
return Option.when(o.getAttr(), () -> Tuple(Option(o.getA()), Option(o.getB())))
.flatMap(ab -> Match(ab).of(
Case($Tuple2($Some($()), $Some($())), () -> calculate(o.getA(), o.getB())),
Case($(), () -> None())
));
}

我替换了CalcResultInteger因为在您的示例中, calculate确实返回 Option<Integer> ,我让你适应你的商业模式。

关于java - 如何使用 Vavr 正确实现这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54113639/

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