0Pricing
Java Academy · Pelajaran

Merangkai dengan thenApply dan thenCompose

Transformasikan hasil dengan thenApply dan ratakan langkah async dengan thenCompose untuk menghindari future bertingkat.

Merangkai dengan thenApply dan thenCompose adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.

thenApply: Mengubah Hasil

thenApply(Function) menerapkan fungsi sinkron pada hasil future yang sudah selesai, lalu mengembalikan future baru dengan tipe yang telah diubah. Ini tidak memulai tugas asinkron baru.

CompletableFuture<String> nameFuture = CompletableFuture
    .supplyAsync(() -> 42L)            // CF<Long>
    .thenApply(id -> "User#" + id);    // CF<String>
System.out.println(nameFuture.join()); // "User#42"

thenApplyAsync: Mengubah pada Sebuah Utas

thenApplyAsync menjalankan fungsi transformasi pada ForkJoinPool (atau pelaksana yang diberikan), sehingga utas yang menyelesaikan komputasi dapat segera dibebaskan.

CompletableFuture<String> result = fetchUserAsync()
    .thenApplyAsync(user -> serialize(user)); // runs on pool thread

thenAccept: Memproses Tanpa Mengembalikan Nilai

thenAccept(Consumer) memproses hasil, tetapi mengembalikan CompletableFuture<Void>. Gunakan ini sebagai langkah terakhir dalam alur ketika Anda tidak perlu meneruskan nilai.

fetchUserAsync()
    .thenApply(User::getName)
    .thenAccept(name -> System.out.println("Hello, " + name));

thenRun: Menjalankan Setelah Selesai

thenRun(Runnable) menjalankan tugas setelah future selesai dan mengabaikan hasilnya. Ini cocok untuk menutup sumber daya atau memicu efek samping.

downloadFileAsync(url)
    .thenRun(() -> System.out.println("Download complete"));

Merangkai Beberapa Pemanggilan thenApply

Beberapa pemanggilan thenApply membentuk sebuah alur. Setiap langkah menerima keluaran dari langkah sebelumnya.

CompletableFuture<Double> result = CompletableFuture
    .supplyAsync(() -> "  42.5  ")
    .thenApply(String::trim)
    .thenApply(Double::parseDouble)
    .thenApply(d -> d * 1.21); // apply 21% VAT
System.out.println(result.join()); // 51.425

thenCompose: Meratakan Future Bersarang

thenCompose(Function<T, CompletionStage<U>>) mirip dengan flatMap untuk future. Ini menghindari CompletableFuture<CompletableFuture<T>> dengan meratakan future yang bersarang.

// Wrong with thenApply — returns CF<CF<Order>>:
CompletableFuture<CompletableFuture<Order>> nested =
    fetchUser(id).thenApply(u -> fetchLatestOrder(u.getId()));
// Correct with thenCompose — returns CF<Order>:
CompletableFuture<Order> flat =
    fetchUser(id).thenCompose(u -> fetchLatestOrder(u.getId()));

thenCompose untuk Pemanggilan Asinkron Berurutan

Gunakan thenCompose ketika setiap langkah asinkron bergantung pada hasil langkah sebelumnya — sehingga langkah-langkah berjalan berurutan dan bergantung pada hasil.

fetchUser(userId)
    .thenCompose(user -> fetchOrders(user.getId()))
    .thenCompose(orders -> computeTotal(orders))
    .thenAccept(total -> System.out.println("Total: " + total));

thenApply dibandingkan dengan thenCompose

thenApply: memetakan T -> U (transformasi sinkron). thenCompose: memetakan T -> CompletableFuture<U> dan meratakannya. Gunakan compose ketika langkah berikutnya juga asinkron.

Menangani Kesalahan Perantara dengan handle

handle(BiFunction<T, Throwable, U>) dipanggil baik ketika future selesai secara normal maupun dengan pengecualian, sehingga memungkinkan pemulihan atau transformasi kesalahan di tengah alur.

fetchUser(id)
    .thenApply(User::getProfile)
    .handle((profile, ex) -> {
        if (ex != null) return Profile.empty(); // recover
        return profile;
    })
    .thenAccept(System.out::println);

whenComplete: Efek Samping Setelah Hasil Apa Pun

whenComplete(BiConsumer) dipanggil setelah penyelesaian (normal atau dengan pengecualian) untuk pencatatan atau pembersihan. Berbeda dengan handle, metode ini tidak mengubah hasil.

fetchAsync()
    .whenComplete((result, ex) -> {
        if (ex != null) log.error("Failed", ex);
        else            log.info("Result: " + result);
    });

Contoh Alur Tanpa Pemblokiran

Susun alur yang sepenuhnya tanpa pemblokiran: ambil data pengguna, ambil pesanannya, lalu hitung ringkasan — semua langkah berjalan secara asinkron dan masing-masing bergantung pada langkah sebelumnya.

CompletableFuture<String> summary =
    fetchUser(userId)
        .thenCompose(u -> fetchOrders(u.getId()))
        .thenApply(orders -> orders.size() + " orders")
        .exceptionally(ex -> "Error: " + ex.getMessage());
System.out.println(summary.join());

Pemeriksaan Singkat

Kapan Anda sebaiknya menggunakan thenCompose, bukan thenApply?

Ringkasan

thenApply mengubah nilai sinkron dalam sebuah alur. thenCompose merangkai langkah asinkron (flatMap untuk future). handle / whenComplete menambahkan penanganan kesalahan dan efek samping. Susun alur dari kiri ke kanan agar mudah dibaca.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Merangkai dengan thenApply dan thenCompose” gratis?

Ya — teks lengkap “Merangkai dengan thenApply dan thenCompose” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Merangkai dengan thenApply dan thenCompose”?

Transformasikan hasil dengan thenApply dan ratakan langkah async dengan thenCompose untuk menghindari future bertingkat. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Java Academy?

Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Merangkai dengan thenApply dan thenCompose” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?

Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Membuat dan Menyelesaikan CompletableFutures
  2. Merangkai dengan thenApply dan thenCompose
  3. Menggabungkan Future: allOf dan anyOf
  4. Penanganan Error dan Alur HTTP Async
← Kembali ke Java Academy