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!
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:
-
completeOnTimeout
: Ini akan menyelesaikan future dengan nilai default jika itu tidak selesai dalam 2 detik. -
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