Java - Peningkatan API CompletableFuture
Halo sana, para pengembang Java masa depan! Saya sangat senang untuk memulai perjalanan menarik ini bersama Anda saat kita telusuri dunia yang menakjubkan dari peningkatan API CompletableFuture di Java. Jangan khawatir jika Anda baru belajar pemrograman; kita akan mulai dari dasar dan tingkatkan keahlian kita. Pada akhir panduan ini, Anda akan terpesona melihat betapa banyak yang Anda pelajari!
Apa Itu CompletableFuture?
Sebelum kita mendalamkan peningkatan, mari kita mengerti apa itu CompletableFuture. Bayangkan Anda sedang memasak makanan yang kompleks. Anda tentu tidak ingin menunggu pasta mendidih sebelum Anda mulai memotong sayur-sayuran, kan? CompletableFuture seperti memiliki beberapa chef di dapur Anda, masing-masing bekerja pada tugas yang berbeda secara bersamaan. Itu 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 "Halo, 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, ia mengembalikan pesan salam. Metode get()
menunggu future selesai dan memberikan kita hasilnya.
Support untuk Delay dan Timeout
Salah satu peningkatan menarik di API CompletableFuture adalah dukungan yang lebih baik untuk delay dan timeout. Hal ini seperti menyetel timer di dapur Anda - Anda tidak ingin saus Anda mendidih selamanya!
Contoh Delay
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Halo")
.thenApply(s -> s + ", Dunia!")
.completeOnTimeout("Timeout terjadi", 2, TimeUnit.SECONDS)
.orTimeout(3, TimeUnit.SECONDS);
System.out.println(future.get());
Dalam contoh ini, kita menciptakan future yang mengatakan "Halo", kemudian memodifikasinya menjadi "Halo, Dunia!". Kita menggunakan dua metode baru:
-
completeOnTimeout
: Ini akan menyelesaikan future dengan nilai default jika 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 terhenti jika ada kesalahan yang terjadi.
Peningkatan Dukungan untuk Subclassing
Kelas CompletableFuture sekarang mudah untuk diperpanjang, memungkinkan Anda untuk menciptakan versi spesialisasi sendiri. Hal ini seperti dapat menciptakan peralatan dapur khusus yang melakukan persis apa yang Anda perlukan!
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 metode yang diperpanjang...
}
MyFuture<String> myFuture = new MyFuture<>();
myFuture.complete("Halo, Future Khusus!");
System.out.println(myFuture.get());
Dalam contoh ini, kita menciptakan kelas MyFuture
yang mengextends CompletableFuture
. Kita mengganti metode thenApply
agar mengembalikan jenis future khusus kita. Hal ini memungkinkan kita untuk mengkaitkan operasi sambil menjaga jenis khusus kita.
Metode Factory Baru
Java telah memperkenalkan metode factory baru untuk membuat CompletableFutures menjadi lebih mudah. Hal ini seperti memiliki resep siap pakai di bukunya!
Tabel Metode Factory
Metode | Deskripsi |
---|---|
failedFuture(Throwable ex) | Membuat CompletableFuture yang sudah selesai secara exceptional |
completedStage(T value) | Membuat CompletionStage yang sudah selesai dengan nilai yang diberikan |
failedStage(Throwable ex) | Membuat CompletionStage yang sudah selesai secara exceptional |
Contoh Metode Factory
CompletableFuture<String> successFuture = CompletableFuture.completedFuture("Sukses!");
CompletableFuture<String> failedFuture = CompletableFuture.failedFuture(new Exception("Ups!"));
try {
System.out.println(successFuture.get());
System.out.println(failedFuture.get());
} catch (Exception e) {
System.out.println("Terjadi kesalahan: " + e.getMessage());
}
Dalam contoh ini, kita menggunakan metode completedFuture
untuk menciptakan future yang sudah sukses, dan metode failedFuture
untuk menciptakan satu yang sudah gagal. Hal ini dapat berguna untuk pengujian atau saat Anda perlu mengintegrasikan kode sinkron dan asinkron.
Kesimpulan
Wah! Kita telah meliputi banyak hal hari ini. Dari memahami dasar CompletableFuture ke peningkatan yang baru, Anda telah mengambil langkah pertama ke dunia pemrograman asinkron di Java. Ingat, seperti memasak, memahami konsep ini memerlukan latihan. Jangan khawatir untuk mencoba dan membuat kesalahan - itu adalah bagaimana kita belajar!
Dalam tahun-tahun saya mengajar, saya menemukan bahwa siswa yang sukses adalah mereka yang tidak khawatir untuk mencicipi kode. Jadi, saya mendorong Anda untuk mengambil contoh ini, memodifikasinya, merusaknya, dan lihat apa yang terjadi. Itu cara terbaik untuk benar-benar memahami bagaimana mereka bekerja.
Sebagai penutup, saya diingatkan oleh seorang siswa yang pernah mengatakan bahwa belajar CompletableFuture seperti belajar jongkok - awalnya, tampaknya mustahil untuk menjaga semua bola di udara, tetapi dengan latihan, itu menjadi kebiasaan. Jadi terus latihan, dan sebelum Anda tahu, Anda akan menjongkok operasi asinkron kompleks seperti seorang pro!
Selamat pemrograman, para master Java masa depan!
Credits: Image by storyset