使用 Vavr 链接多个 Try 结果的简洁方法
Clean way to chain multiple Try results using Vavr
在我的项目中,我经常有一个模式,我在其中链接多个可能成功也可能不成功的方法。
我很难找到使用 Vavr 实现它的最干净的方法。
除了这两个还有其他方法吗?
最好是不需要我创建不必要的 lambda 的东西,我什至不使用传递的变量。
// First way to do it: use flatMap to chain it
public Try<String> mainMethod(String someParam) {
return firstOperation()
.flatMap(v -> secondOperation(someParam))
.flatMap(v -> thirdOperation(someParam));
}
// Second way to do it: pattern matching
public Try<String> otherMainMethod(String someParam) {
Try<String> firstResult = firstOperation();
return Match(firstResult)
.of(
Case(
$Success($()),
() -> {
Try<String> secondResult = secondOperation(someParam);
return Match(secondResult)
.of(
Case($Success($()), thirdOperation(someParam)),
Case($Failure($()), secondResult));
}),
Case($Failure($()), firstResult));
}
private Try<String> firstOperation() {
return Try.of(
() -> {
// do something
});
}
private Try<String> secondOperation(String someParam) {
return Try.of(
() -> {
// Try something
});
}
private Try<String> thirdOperation(String someParam) {
return Try.of(
() -> {
// Try something
});
}
一个优雅的解决方案是使用 vavr 的 for comprehension:
public Try<String> yetAnotherMainMethod(String someParam) {
return API.For(firstOperation(), secondOperation(someParam), thirdOperation(someParam)).yield((s, s2, s3) -> s.concat(s2).concat(s3));
}
在我的项目中,我经常有一个模式,我在其中链接多个可能成功也可能不成功的方法。
我很难找到使用 Vavr 实现它的最干净的方法。
除了这两个还有其他方法吗?
最好是不需要我创建不必要的 lambda 的东西,我什至不使用传递的变量。
// First way to do it: use flatMap to chain it
public Try<String> mainMethod(String someParam) {
return firstOperation()
.flatMap(v -> secondOperation(someParam))
.flatMap(v -> thirdOperation(someParam));
}
// Second way to do it: pattern matching
public Try<String> otherMainMethod(String someParam) {
Try<String> firstResult = firstOperation();
return Match(firstResult)
.of(
Case(
$Success($()),
() -> {
Try<String> secondResult = secondOperation(someParam);
return Match(secondResult)
.of(
Case($Success($()), thirdOperation(someParam)),
Case($Failure($()), secondResult));
}),
Case($Failure($()), firstResult));
}
private Try<String> firstOperation() {
return Try.of(
() -> {
// do something
});
}
private Try<String> secondOperation(String someParam) {
return Try.of(
() -> {
// Try something
});
}
private Try<String> thirdOperation(String someParam) {
return Try.of(
() -> {
// Try something
});
}
一个优雅的解决方案是使用 vavr 的 for comprehension:
public Try<String> yetAnotherMainMethod(String someParam) {
return API.For(firstOperation(), secondOperation(someParam), thirdOperation(someParam)).yield((s, s2, s3) -> s.concat(s2).concat(s3));
}