我在每个中都看到了一个例子,但我需要确切地知道它们之间的区别,因为我认为我可以使用它们来获得相同的结果,所以我想知道我应该选择哪一个。
使用它们各自的好处是什么?
就像这个例子一样,两者都可以工作:
public CompletionStage<Result> getNextQueryUUID() {
return CompletableFuture.supplyAsync(() -> {
String nextId = dbRequestService.getNextRequestQueryUUID();
return ok(nextId);
}, executor);
}
public CompletableFuture<Result> getNextQueryUUID() {
return CompletableFuture.supplyAsync(() -> {
String nextId = dbRequestService.getNextRequestQueryUUID();
return ok(nextId);
}, executor);
}
这个例子在
Play框架
中运行。
Thread
类和Runnable
接口之间的区别,因此有更多的方法可供使用,但即使如此,在定义类型为CompletableFuture<T>
的字段而不是通过一个方法返回值时,会有更多的好处。 - Ebraheem AlrabeeaCompletionStage
接口只包含用于可能是异步的计算的抽象方法。因此,实现类型几乎总会比其基本类型具有更多功能,正如 Eugene 在他的帖子中提到的那样,除非您正在使用该接口的其他实现,否则现在使用CompletableFuture<T>
作为目标类型可能是有意义的。但是,未来可能会有更多的实现类,你永远不知道。 - Ousmane D.CompletionStage
而不是CompletableFuture
。 - HermesCompletionStage
提供给调用者的是一个受损的实现。值得注意的缺失方法包括get
、join
和cancel
。你可以通过调用toCompletableFuture()
来获取它们,但如果你经常需要这样做,那么这会让代码变得混乱。如果你不断地将其转换为具体的实现,那么返回接口也就没有意义了。 - jocull