flatMap untuk Koleksi Bersarang
Ratakan senarai bersarang, rantai Optional dan struktur baris fail menggunakan flatMap.
flatMap untuk Koleksi Bersarang ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Masalah Koleksi Bersarang
Apabila setiap elemen stream memetakan kepada koleksi lain, map menghasilkan Stream<List<T>>. flatMap menggabungkan stream dalaman menjadi satu Stream<T> yang rata.
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 berbanding map
map(f) menggunakan f pada setiap elemen dan membungkus hasilnya. flatMap(f) menggunakan f yang mengembalikan stream, kemudian menggabungkan semua stream 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 Item
Penggunaan klasik: setiap pesanan mempunyai senarai item. Dapatkan stream rata yang mengandungi semua item daripada semua 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 menukarnya kepada stream yang mengandungi 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 daripada Berbilang Fail
flatMap memudahkan penggabungan semua baris daripada senarai fail menjadi satu stream tanpa gelung 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 Rentetan Menjadi Perkataan
Pisahkan setiap ayat menjadi perkataan dan ratakan semua perkataan menjadi satu stream untuk pengiraan kekerapan perkataan.
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 kepada senarai item menjadi stream yang mengandungi semua item.
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]Mengelakkan NullPointerException dalam flatMap
Jika fungsi mungkin mengembalikan null dan bukannya stream, lindungi dengan pemeriksaan null atau kembalikan Stream.empty() untuk mengelakkan NullPointerException.
departments.stream()
.flatMap(dept -> dept.getEmployees() == null
? Stream.empty()
: dept.getEmployees().stream())
.forEach(System.out::println);Mengira Perkataan Berbeza dengan flatMap
Gabungkan flatMap, distinct dan count untuk pemprosesan 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 Stream Primitif
Gunakan flatMapToInt, flatMapToLong dan flatMapToDouble untuk mengelakkan pembungkusan semasa meratakan stream primitif.
int totalQuantity = orders.stream()
.flatMapToInt(order -> order.getItems().stream().mapToInt(Item::getQuantity))
.sum();
System.out.println("Total qty: " + totalQuantity);Nota Prestasi
Setiap seruan flatMap menambah satu lapisan stream. Untuk set data yang sangat besar dengan banyak koleksi dalaman yang kecil, pertimbangkan pendekatan lelaran atau Spliterator untuk mengurangkan overhed penciptaan objek.
Semakan Pantas
Apakah perbezaan flatMap berbanding map?
Rumusan
flatMap menukar setiap elemen kepada stream dan menggabungkan semua stream menjadi satu. Gunakannya untuk meratakan koleksi bersarang, merangkaikan Optional, memisahkan rentetan dan membaca berbilang fail. Gunakan flatMapToInt untuk mengelakkan pembungkusan.
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “flatMap untuk Koleksi Bersarang” percuma?
Ya — teks penuh “flatMap untuk Koleksi Bersarang” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “flatMap untuk Koleksi Bersarang”?
Ratakan senarai bersarang, rantai Optional dan struktur baris fail menggunakan flatMap. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “flatMap untuk Koleksi Bersarang” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- flatMap untuk Koleksi Bersarang
- Strim Selari: Prestasi dan Perangkap
- Spliterator: Pemisahan untuk Keselarian
- Strim Tanpa Had dengan iterate dan generate