Penambahbaikan API CompletableFuture di Java

Hai sana, para pengembang Java masa depan! Saya sangat gembira untuk memulai perjalanan yang menarik ini bersama Anda saat kita telusuri dunia yang menakjubkan dari penambahbaikan API CompletableFuture di Java. Jangan khawatir jika Anda baru belajar pemrograman; kita akan mulai dari dasar dan naik tingkat perlahan-lahan. Pada akhir panduan ini, Anda akan terkejut melihat betapa banyak yang Anda pelajari!

Java - CompletableFuture API Improvements

Apa Itu CompletableFuture?

Sebelum kita masuk ke penambahbaikan, mari kita pahami apa CompletableFuture itu. Bayangkan Anda sedang memasak makanan yang kompleks. Anda tentu tidak mau menunggu pasta mendidih sebelum Anda mulai memotong sayur, kan? CompletableFuture seperti memiliki beberapa chef di dapur Anda, masing-masing bekerja pada tugas yang berbeda secara bersamaan. Itu adalah cara Java untuk mengelola pemrograman asinkron, memungkinkan kode Anda melakukan beberapa hal secara bersamaan tanpa menjadi bingung.

Contoh CompletableFuture Dasar

Mari kita mulai dengan contoh sederhana:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello, Future!";
});

System.out.println(future.get());

Dalam kode ini, kita menciptakan CompletableFuture yang akan mengembalikan String. Metode supplyAsync menjalankan kode kita di thread yang terpisah. Kita mensimulasikan pekerjaan dengan membuat thread tidur selama satu detik. Setelah itu, itu mengembalikan pesan selamat. Metode get() menunggu future selesai dan memberikan kita hasilnya.

Dukungan untuk Penundaan dan Timeout

Salah satu penambahbaikan menarik di API CompletableFuture adalah dukungan yang lebih baik untuk penundaan dan timeout. Ini seperti menyetel timer di dapur Anda - Anda tidak mau saus Anda mendidih selamanya!

Contoh Penundaan

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")
.thenApply(s -> s + ", World!")
.completeOnTimeout("Timeout occurred", 2, TimeUnit.SECONDS)
.orTimeout(3, TimeUnit.SECONDS);

System.out.println(future.get());

Dalam contoh ini, kita menciptakan future yang mengatakan "Hello", kemudian mengubahnya menjadi "Hello, World!". Kita menggunakan dua metode baru:

  1. completeOnTimeout: Ini akan menyelesaikan future dengan nilai default jika itu tidak selesai dalam 2 detik.
  2. orTimeout: Ini akan melempar exception jika future tidak selesai dalam 3 detik.

Dengan cara ini, kita memastikan bahwa kode kita tidak tergantung jika ada yang salah.

Dukungan Improved untuk Subclassing

Kelas CompletableFuture sekarang mudah untuk diperpanjang, memungkinkan Anda menciptakan versi khusus Anda sendiri. Ini seperti dapat menciptakan peralatan dapur khusus yang melakukan persis apa yang Anda butuhkan!

Contoh Subclassing

public class MyFuture<T> extends CompletableFuture<T> {
@Override
public <U> MyFuture<U> thenApply(Function<? super T, ? extends U> fn) {
return (MyFuture<U>) super.thenApply(fn);
}

// Lain-lain method yang diperpanjang...
}

MyFuture<String> myFuture = new MyFuture<>();
myFuture.complete("Hello, Custom Future!");
System.out.println(myFuture.get());

Dalam contoh ini, kita menciptakan kelas MyFuture yang mengembangkan CompletableFuture. Kita menimpa metode thenApply untuk mengembalikan jenis future khusus kita. Ini memungkinkan kita untuk mengkaitkan operasi sambil menjaga jenis khusus kita.

Metode Pabrik Baru

Java telah memperkenalkan metode pabrik baru untuk membuat CompletableFutures lebih mudah. Itu seperti memiliki resep siap pakai di buku masak Anda!

Tabel Metode Pabrik

Metode Deskripsi
failedFuture(Throwable ex) Membuat CompletableFuture yang sudah selesai secara exceptional
completedStage(T value) Membuat CompletionStage baru yang sudah selesai dengan nilai yang diberikan
failedStage(Throwable ex) Membuat CompletionStage baru yang sudah selesai secara exceptional

Contoh Metode Pabrik

CompletableFuture<String> successFuture = CompletableFuture.completedFuture("Success!");
CompletableFuture<String> failedFuture = CompletableFuture.failedFuture(new Exception("Oops!"));

try {
System.out.println(successFuture.get());
System.out.println(failedFuture.get());
} catch (Exception e) {
System.out.println("An error occurred: " + e.getMessage());
}

Dalam contoh ini, kita menggunakan metode completedFuture untuk menciptakan future yang sudah sukses, dan metode failedFuture untuk menciptakan satu yang sudah gagal. Ini bisa berguna untuk pengujian atau saat Anda perlu mengintegrasikan kode sinkron dan asinkron.

Kesimpulan

Wah! Kita telah menempuh banyak hal hari ini. Dari memahami dasar CompletableFuture hingga menjelajahi penambahbaikannya, Anda telah mengambil langkah pertama ke dunia pemrograman asinkron di Java. Ingat, seperti memasak, memahami konsep ini memerlukan latihan. Jangan takut untuk mencoba dan membuat kesalahan - itu adalah bagaimana kita belajar!

Dalam tahun-tahun mengajar saya, saya menemukan bahwa siswa yang menonjol adalah mereka yang tidak takut untuk mencoba kode. Jadi, saya mendorong Anda untuk mengambil contoh ini, memodifikasinya, merusaknya, dan lihat apa yang terjadi. Itu adalah cara terbaik untuk benar-benar memahami bagaimana mereka bekerja.

Saat kita mengakhiri, saya teringat tentang seorang siswa yang pernah berkata kepadaku bahwa belajar CompletableFuture seperti belajar jongkok - pertama-tama, itu tampak mustahil untuk menjaga semua bola di udara, tetapi dengan latihan, itu menjadi kebiasaan. Jadi terus latihan, dan sebelum Anda tahu, Anda akan jongkok operasi asinkron kompleks seperti seorang ahli!

Selamat coding, para master Java masa depan!

Credits: Image by storyset