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 5flatMap 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
- flatMap untuk Koleksi Bersarang
- Stream Paralel: Kinerja dan Jebakan
- Spliterator: Pemisahan untuk Paralelisme
- Stream Tak Terbatas dengan iterate dan generate