Widziałem przykład w każdym z nich, ale muszę wiedzieć dokładnie, jaka jest różnica w głębokiej, ponieważ czasami myślę, że mogę użyć obu z nich, aby uzyskać ten sam wynik, więc chcę wiedzieć, żebym mógł wybrać właściwy?Jaka jest różnica między "CompletionStage" i "CompletableFuture"?
Jakie są korzyści z korzystania z każdego z nich?
jak w poniższym przykładzie oba pracowali:
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);
}
Ten przykład uruchomić w
Play framework
.
Myślę, że po raz pierwszy jest jak różnica między klasą "Wątek" i interfejsem "Runnable", więc istnieje więcej metod do wykorzystania, ale jeszcze więcej, które przyniosą korzyści, gdy zdefiniuję pole typu 'CompletableFuture' zamiast zwracania wartości za pomocą metody. –
@EbraheemAlrabee Interfejs 'CompletionStage' zawiera proste metody obliczeń, które mogą ale nie muszą być asynchroniczne. tak więc typ _implementing_ prawie zawsze będzie miał większą funkcjonalność niż typ bazowy, więc jak wspomniał Eugene w swoim poście, chyba że używasz innej implementacji tego interfejsu, to prawdopodobnie ma sens użycie 'CompletableFuture' as typ docelowy _for now_.Jednak w przyszłości może być więcej klas implementacyjnych, nigdy nie wiadomo. –