gpt4 book ai didi

java-8 - 仅在满足条件时链接多个CompletionStage

转载 作者:行者123 更新时间:2023-12-03 20:45:09 25 4
gpt4 key购买 nike

我有几个要链接的CompletionStage方法。问题在于,第一个结果将确定是否应执行下一个。现在,实现此目标的唯一方法似乎是将“特殊”参数传递给下一个CompletionStage,因此它不执行完整的代码。例如:

public enum SomeResult {
RESULT_1,
RESULT_2,
RESULT_3
}

public CompletionStage<SomeResult> someMethod(SomeArgument someArgument) {

return CompletableFuture.supplyAsync(() -> {
// loooooong operation
if (someCondition)
return validValue;
else
return null;
}).thenCompose(result -> {
if (result != null)
return someMethodThatReturnsACompletionStage(result);
else
return CompletableFuture.completedFuture(null);
}).thenApply(result -> {
if (result == null)
return ChainingResult.RESULT_1;
else if (result.someCondition())
return ChainingResult.RESULT_2;
else
return ChainingResult.RESULT_3;
});
}


由于整个代码取决于第一个 someCondition(如果为 false,则结果为 RESULT_1,否则,应执行整个代码),这种结构对我来说有点难看。有什么方法可以决定是否应该执行第二( thenCompose(...))和第三( thenApply(...))方法?

最佳答案

您可以这样做:

public CompletionStage<SomeResult> someMethod(SomeArgument someArgument) {
CompletableFuture<SomeResult> shortCut = new CompletableFuture<>();
CompletableFuture<ResultOfFirstOp> withChain = new CompletableFuture<>();

CompletableFuture.runAsync(() -> {
// loooooong operation
if (someCondition)
withChain.complete(validValue);
else
shortCut.complete(SomeResult.RESULT_1);
});
return withChain
.thenCompose(result -> someMethodThatReturnsACompletionStage(result))
.thenApply(result ->
result.someCondition()? SomeResult.RESULT_2: SomeResult.RESULT_3)
.applyToEither(shortCut, Function.identity());
}


我们创建两个,而不是一个 CompletableFuture,代表我们可能采用的不同执行路径。然后,将loooooong操作提交为可运行的,并将有意完成这些 CompletableFuture之一。后续阶段链接到表示满足条件的阶段,然后两个执行路径都在最后一个 applyToEither(shortCut, Function.identity())步骤中加入。

shortCut将来已经具有最终结果的类型,并且将通过 RESULT_1(您的 null传递路径的结果)完成,这将立即完成整个操作。如果您不喜欢快捷方式的第一阶段和实际结果之间的依赖关系,则可以按以下方式撤消它:

public CompletionStage<SomeResult> someMethod(SomeArgument someArgument) {
CompletableFuture<Object> shortCut = new CompletableFuture<>();
CompletableFuture<ResultOfFirstOp> withChain = new CompletableFuture<>();

CompletableFuture.runAsync(() -> {
// loooooong operation
if (someCondition)
withChain.complete(validValue);
else
shortCut.complete(null);
});
return withChain
.thenCompose(result -> someMethodThatReturnsACompletionStage(result))
.thenApply(result ->
result.someCondition()? SomeResult.RESULT_2: SomeResult.RESULT_3)
.applyToEither(shortCut.thenApply(x -> SomeResult.RESULT_1), Function.identity());
}


如果您的第三步不是示例性的,而是与问题中显示的完全一样,则可以将其与代码路径联接步骤合并:

public CompletionStage<SomeResult> someMethod(SomeArgument someArgument) {
CompletableFuture<ResultOfSecondOp> shortCut = new CompletableFuture<>();
CompletableFuture<ResultOfFirstOp> withChain = new CompletableFuture<>();

CompletableFuture.runAsync(() -> {
// loooooong operation
if (someCondition)
withChain.complete(validValue);
else
shortCut.complete(null);
});
return withChain
.thenCompose(result -> someMethodThatReturnsACompletionStage(result))
.applyToEither(shortCut, result -> result==null? SomeResult.RESULT_1:
result.someCondition()? SomeResult.RESULT_2: SomeResult.RESULT_3);
}


那么我们只跳过第二步,即 someMethodThatReturnsACompletionStage调用,但这仍然可以代表一连串的中间步骤,所有这些步骤都可以跳过,而无需通过nullcheck进行手动跳过。

关于java-8 - 仅在满足条件时链接多个CompletionStage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36406290/

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