0Pricing
Java Academy · Pelajaran

flatMap untuk Koleksi Bersarang

Ratakan daftar bersarang, rantai Optional, dan struktur baris file menggunakan flatMap.

flatMap untuk Koleksi Bersarang adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 1 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.

Masalah Koleksi Bersarang

Saat setiap elemen aliran memetakan ke koleksi lain, map menghasilkan Stream<List<T>>. flatMap menggabungkan aliran bagian dalam menjadi satu Stream<T> yang datar.

List<List<Integer>> nested = List.of(List.of(1,2), List.of(3,4), List.of(5));
// With map:
Stream<List<Integer>> s = nested.stream().map(l -> l); // Stream<List<Integer>>
// With flatMap:
Stream<Integer> flat = nested.stream().flatMap(List::stream); // Stream<Integer>
flat.forEach(System.out::println); // 1 2 3 4 5

flatMap vs map

map(f) menerapkan f ke setiap elemen dan membungkus hasilnya. flatMap(f) menerapkan f yang mengembalikan aliran, lalu menggabungkan semua aliran tersebut menjadi satu.

// map: List<String> -> Stream<Stream<Character>>
Stream<Stream<Character>> nested = List.of("hi","bye").stream()
    .map(s -> s.chars().mapToObj(c -> (char)c));
// flatMap: List<String> -> Stream<Character>
Stream<Character> flat = List.of("hi","bye").stream()
    .flatMap(s -> s.chars().mapToObj(c -> (char)c));

Meratakan Pesanan dan Elemen

Penggunaan klasik: setiap pesanan memiliki daftar elemen. Dapatkan aliran datar yang berisi semua elemen dari seluruh pesanan.

List<String> allItems = orders.stream()
    .flatMap(order -> order.getItems().stream())
    .collect(Collectors.toList());
System.out.println(allItems);

flatMap dengan Optional

Gunakan stream() pada Optional (Java 9+) untuk mengubahnya menjadi aliran berisi 0 atau 1 elemen. Kemudian flatMap meratakan Stream<Optional<T>> menjadi Stream<T>.

List<Optional<String>> maybes = List.of(Optional.of("a"), Optional.empty(), Optional.of("c"));
List<String> values = maybes.stream()
    .flatMap(Optional::stream)  // Java 9+
    .collect(Collectors.toList());
System.out.println(values); // [a, c]

Membaca Semua Baris dari Beberapa Berkas

flatMap memudahkan penggabungan semua baris dari daftar berkas menjadi satu aliran tanpa perulangan bersarang.

List<Path> files = List.of(Path.of("a.txt"), Path.of("b.txt"));
List<String> allLines = files.stream()
    .flatMap(p -> {
        try { return Files.lines(p); }
        catch (IOException e) { return Stream.empty(); }
    })
    .collect(Collectors.toList());

Memisahkan String Menjadi Kata

Pisahkan setiap kalimat menjadi kata, lalu ratakan semua kata menjadi satu aliran untuk menghitung frekuensi kata.

List<String> sentences = List.of("hello world", "java streams rock");
Map<String, Long> freq = sentences.stream()
    .flatMap(s -> Arrays.stream(s.split("\\s+")))
    .collect(Collectors.groupingBy(w -> w, Collectors.counting()));
System.out.println(freq);

flatMap dengan Map.entrySet

Ratakan peta kategori ke daftar elemen menjadi aliran yang berisi semua elemen.

Map<String, List<String>> catalog = Map.of(
    "fruit", List.of("apple","banana"),
    "veg",   List.of("carrot","pea"));
List<String> all = catalog.values().stream()
    .flatMap(List::stream)
    .sorted()
    .collect(Collectors.toList());
System.out.println(all); // [apple, banana, carrot, pea]

Menghindari NullPointerException dalam flatMap

Jika fungsi mungkin mengembalikan null, bukan aliran, lakukan pemeriksaan null atau kembalikan Stream.empty() untuk menghindari NullPointerException.

departments.stream()
    .flatMap(dept -> dept.getEmployees() == null
        ? Stream.empty()
        : dept.getEmployees().stream())
    .forEach(System.out::println);

Menghitung Kata Berbeda dengan flatMap

Gabungkan flatMap, distinct, dan count untuk pemrosesan data yang ringkas.

long distinctWords = sentences.stream()
    .flatMap(s -> Arrays.stream(s.toLowerCase().split("[^a-z]+")))
    .filter(w -> !w.isEmpty())
    .distinct()
    .count();
System.out.println("Distinct: " + distinctWords);

flatMapToInt untuk Aliran Primitif

Gunakan flatMapToInt, flatMapToLong, dan flatMapToDouble untuk menghindari pembungkusan saat meratakan menjadi aliran primitif.

int totalQuantity = orders.stream()
    .flatMapToInt(order -> order.getItems().stream().mapToInt(Item::getQuantity))
    .sum();
System.out.println("Total qty: " + totalQuantity);

Catatan Kinerja

Setiap pemanggilan flatMap menambahkan satu lapisan aliran. Untuk kumpulan data yang sangat besar dengan banyak koleksi bagian dalam berukuran kecil, pertimbangkan pendekatan iteratif atau Spliterator untuk mengurangi beban tambahan pembuatan objek.

Pemeriksaan Singkat

Apa perbedaan tindakan flatMap dibandingkan dengan map?

Ringkasan

flatMap mengubah setiap elemen menjadi aliran dan menggabungkan semua aliran menjadi satu. Gunakan untuk meratakan koleksi bersarang, menghubungkan Optional, memisahkan string, dan membaca beberapa berkas. Gunakan flatMapToInt untuk menghindari pembungkusan.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “flatMap untuk Koleksi Bersarang” gratis?

Ya — teks lengkap “flatMap untuk Koleksi Bersarang” 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 “flatMap untuk Koleksi Bersarang”?

Ratakan daftar bersarang, rantai Optional, dan struktur baris file menggunakan flatMap. 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 1 dari 4.

Berapa lama pelajaran “flatMap untuk Koleksi Bersarang” 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. flatMap untuk Koleksi Bersarang
  2. Stream Paralel: Kinerja dan Jebakan
  3. Spliterator: Pemisahan untuk Paralelisme
  4. Stream Tak Terbatas dengan iterate dan generate
← Kembali ke Java Academy