11 Haziran 2019 Salı

CompletableFuture.thenApply metodu - Allows the Return Type To Be Modified and Returned

Giriş
İmzası şöyle.
<U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn)
Açıklaması şöyle.
CompletableFuture provides operators that allow the return type to be modified and returned.
Yani thenApply() girdi olarak aldığı tipten farklı bir sonuç döndürebilir. Örneğin CompletableFuture<Response> nesnesi alıp CompletableFuture<List<Long>> nesnesine çevirebiliriz.

Kullanım
Şöyle yaparız.
CompletableFuture.supplyAsync(...)
  .thenApply(...)
  .thenApply(...)
  .exceptionally(....)
  .thenAccept(...);

thenApply metodu
İmzası şöyle.
public <U> CompletableFuture<U> thenApply(Function<? super T, ? extends U> fn)
Thread
supplyAsync () metodunu işleten thread'in thenApply() metodunu da işletmesini bekleriz.

Normalde bu kullanım böyle.

Ancak eğer thenApply() çağrısı sırasında complete() bitmişse yani örneğin supplyAsync () hemen sonuçlanmış ise thenApply() metodu örneğin main thread tarafından işletilir. Bu belirsizlik için açıklama şöyle. Normalde bu kullanımın olmasını beklemiyoruz.
Actions supplied for dependent completions of non-async methods may be performed by the thread that completes the current CompletableFuture, or by any other caller of a completion method.
Bunlarla uğraşmak istemiyorsak direkt thenApplyAsync() metodunu kullanmak daha iyi olabilir. thenApplyAsync() metodu ForkJoinPool veya içine verilen ExecutorService tarafından  çalıştıracağını garanti eder.

Örnek
Future nesnesinin döndürdüğü tipi bir başka tipe çevirir. Şöyle yaparız.
CompletableFuture<String> f = CompletableFuture.supplyAsync(() -> "1234");
CompletableFuture<Integer> theNumber = f.thenApply(Integer::parseInt);
System.out.println(theNumber.get());
Örnek
X döndüren bir future nesnesini void döndüren hale getirmek için şöyle yaparız.
public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
  return realChannel.write(engineToSocketData).<Void> thenApply(c -> null);
}
veya şöyle yaparız.
public CompletableFuture<Void> packetEncrypted(ByteBuffer engineToSocketData) {
  return realChannel.write(engineToSocketData).thenApply(c -> (Void) null);

Hiç yorum yok:

Yorum Gönder