toMap, joining, dan summarizing
Ubah stream menjadi map, gabungkan string dengan joining, dan hitung statistik dengan summarizingInt.
toMap, joining, dan summarizing adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.
Dasar-dasar Collectors.toMap
Collectors.toMap(keyMapper, valueMapper) mengubah stream menjadi Map. Setiap elemen menyediakan satu pasangan kunci-nilai.
import java.util.*;
import java.util.stream.*;
record Country(String code, String name) {}
List<Country> countries = List.of(
new Country("US","United States"),
new Country("DE","Germany"),
new Country("JP","Japan")
);
Map<String, String> codeToName =
countries.stream().collect(
Collectors.toMap(Country::code, Country::name)
);
System.out.println(codeToName.get("DE")); // GermanyMenangani Kunci Duplikat
toMap melempar IllegalStateException jika terdapat kunci duplikat. Berikan fungsi merge sebagai argumen ketiga untuk menyelesaikan konflik:
List<String> words = List.of("apple","ant","banana","bat","cherry");
Map<Character, String> firstByLetter =
words.stream().collect(
Collectors.toMap(
w -> w.charAt(0),
w -> w,
(existing, replacement) -> existing // keep first
)
);
System.out.println(firstByLetter); // {a=apple, b=banana, c=cherry}toMap dengan Transformasi Nilai
value mapper dapat berupa fungsi apa pun — ubah elemen sebelum menyimpannya:
record User(String login, String email) {}
List<User> users = List.of(
new User("alice","alice@example.com"),
new User("bob","bob@example.com")
);
Map<String, String> loginToEmail =
users.stream().collect(
Collectors.toMap(User::login, u -> u.email().toUpperCase())
);
System.out.println(loginToEmail.get("alice")); // ALICE@EXAMPLE.COMtoUnmodifiableMap
Gunakan Collectors.toUnmodifiableMap() untuk menghasilkan map yang tidak dapat diubah — setara dengan membungkusnya menggunakan Collections.unmodifiableMap(), tetapi lebih rapi:
Map<String, Integer> wordLengths =
Stream.of("Java","Stream","API")
.collect(Collectors.toUnmodifiableMap(w -> w, String::length));
// wordLengths.put("test",4); // throws UnsupportedOperationExceptionCollectors.joining
Collectors.joining() menggabungkan elemen-elemen string. Kolektor ini menerima pembatas, awalan, dan akhiran yang bersifat opsional:
List<String> names = List.of("Alice","Bob","Carol");
System.out.println(names.stream().collect(Collectors.joining()));
// AliceBobCarol
System.out.println(names.stream().collect(Collectors.joining(", ")));
// Alice, Bob, Carol
System.out.println(names.stream().collect(Collectors.joining(", ", "[", "]")));
// [Alice, Bob, Carol]joining untuk Output CSV
Buat baris CSV atau klausa SQL IN dengan joining:
List<Integer> ids = List.of(1,2,3,4,5);
String inClause = ids.stream()
.map(Object::toString)
.collect(Collectors.joining(",", "(", ")"));
System.out.println("WHERE id IN " + inClause);
// WHERE id IN (1,2,3,4,5)summarizingInt / Long / Double
Collectors.summarizingInt() menghitung semua statistik dalam satu lintasan dan mengembalikan IntSummaryStatistics:
record Product(String name, int price) {}
List<Product> products = List.of(
new Product("A",100), new Product("B",200), new Product("C",150)
);
IntSummaryStatistics stats =
products.stream().collect(Collectors.summarizingInt(Product::price));
System.out.println("Count: " + stats.getCount()); // 3
System.out.println("Sum: " + stats.getSum()); // 450
System.out.println("Min: " + stats.getMin()); // 100
System.out.println("Max: " + stats.getMax()); // 200
System.out.println("Avg: " + stats.getAverage()); // 150.0summingInt dan averagingInt
Untuk kasus yang lebih sederhana ketika Anda hanya memerlukan satu statistik:
int total = products.stream().collect(Collectors.summingInt(Product::price));
System.out.println("Total: " + total); // 450
double avg = products.stream().collect(Collectors.averagingInt(Product::price));
System.out.println("Average: " + avg); // 150.0groupingBy dengan summarizingInt
Gabungkan peringkasan untuk setiap grup:
record Sale(String region, int amount) {}
List<Sale> sales = List.of(
new Sale("North",100), new Sale("South",200),
new Sale("North",150), new Sale("South",300)
);
Map<String, IntSummaryStatistics> statsByRegion =
sales.stream().collect(
Collectors.groupingBy(Sale::region,
Collectors.summarizingInt(Sale::amount))
);
statsByRegion.forEach((r,s) ->
System.out.printf("%s: sum=%d avg=%.1f%n", r, s.getSum(), s.getAverage()));Mengumpulkan ke LinkedHashMap
Secara default, toMap menghasilkan HashMap (tidak terurut). Gunakan bentuk overload dengan 4 argumen untuk menentukan LinkedHashMap agar urutan penyisipan tetap dipertahankan:
Map<String, Integer> ordered =
Stream.of("banana","apple","cherry")
.collect(Collectors.toMap(
w -> w,
String::length,
(a,b) -> a,
LinkedHashMap::new
));
System.out.println(ordered.keySet()); // [banana, apple, cherry]Praktik: Pengurai Konfigurasi
Urai baris key=value menjadi map dengan toMap:
List<String> lines = List.of("host=localhost","port=5432","db=myapp");
Map<String, String> config =
lines.stream()
.map(l -> l.split("=", 2))
.collect(Collectors.toMap(a -> a[0], a -> a[1]));
System.out.println(config.get("port")); // 5432Pemeriksaan Singkat
Anda menggunakan Collectors.toMap(k, v) pada stream yang berisi dua elemen dengan kunci yang sama. Apa yang terjadi?
Ringkasan: toMap, joining, summarizing
Poin-poin penting:
- toMap(keyMapper, valueMapper) — melempar pengecualian pada kunci duplikat tanpa fungsi merge
- joining(delimiter, prefix, suffix) — menggabungkan string dengan rapi
- summarizingInt memberikan jumlah+total+minimum+maksimum+rata-rata dalam satu lintasan
- summingInt/averagingInt untuk kebutuhan satu statistik
- Gunakan toMap dengan 4 argumen bersama LinkedHashMap::new untuk hasil yang terurut
Pertanyaan yang Sering Diajukan
Apakah pelajaran “toMap, joining, dan summarizing” gratis?
Ya — teks lengkap “toMap, joining, dan summarizing” 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 “toMap, joining, dan summarizing”?
Ubah stream menjadi map, gabungkan string dengan joining, dan hitung statistik dengan summarizingInt. 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 3 dari 4.
Berapa lama pelajaran “toMap, joining, dan summarizing” 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
- groupingBy: Mengelompokkan Elemen
- partitioningBy dan counting
- toMap, joining, dan summarizing
- Membangun Collector Kustom