0Pricing
Java Academy · Pelajaran

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")); // Germany

Menangani 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.COM

toUnmodifiableMap

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 UnsupportedOperationException

Collectors.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.0

summingInt 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.0

groupingBy 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")); // 5432

Pemeriksaan 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

  1. groupingBy: Mengelompokkan Elemen
  2. partitioningBy dan counting
  3. toMap, joining, dan summarizing
  4. Membangun Collector Kustom
← Kembali ke Java Academy