Java Academy · Pelajaran

groupingBy: Mengelompokkan Elemen

Kelompokkan elemen stream ke dalam map berdasarkan fungsi pengelompokan dan rangkai dengan pengumpul lanjutan.

Pelajaran 1 dari 413 langkah

groupingBy: Mengelompokkan Elemen 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.

Apa itu groupingBy?

Collectors.groupingBy() mempartisi elemen stream ke dalam sebuah Map, dengan setiap kunci memetakan ke daftar elemen yang sesuai. Ini adalah padanan stream untuk GROUP BY dalam SQL.

import java.util.*;
import java.util.stream.*;

record Person(String name, String city) {}
List<Person> people = List.of(
    new Person("Alice","NYC"), new Person("Bob","LA"),
    new Person("Carol","NYC"), new Person("Dave","LA"),
    new Person("Eve","Chicago")
);

Map<String, List<Person>> byCity =
    people.stream().collect(Collectors.groupingBy(Person::city));
byCity.forEach((city, ps) -> System.out.println(city + ": " + ps.size()));

Kolektor Hilir: counting

Gabungkan groupingBy dengan kolektor hilir untuk melakukan agregasi, bukan membuat daftar:

Map<String, Long> countByCity =
    people.stream().collect(
        Collectors.groupingBy(Person::city, Collectors.counting())
    );
countByCity.forEach((city, n) -> System.out.println(city + " -> " + n));
// NYC -> 2, LA -> 2, Chicago -> 1

Kolektor Hilir: mapping

Gunakan Collectors.mapping() sebagai kolektor hilir untuk mengubah elemen sebelum mengumpulkannya:

Map<String, List<String>> namesByCity =
    people.stream().collect(
        Collectors.groupingBy(
            Person::city,
            Collectors.mapping(Person::name, Collectors.toList())
        )
    );
namesByCity.forEach((city, names) -> System.out.println(city + ": " + names));

Kolektor Hilir: joining

Gabungkan nama dalam setiap grup menjadi satu string yang dipisahkan koma:

Map<String, String> joinedByCity =
    people.stream().collect(
        Collectors.groupingBy(
            Person::city,
            Collectors.mapping(Person::name, Collectors.joining(", "))
        )
    );
joinedByCity.forEach((city, s) -> System.out.println(city + ": " + s));
// NYC: Alice, Carol

groupingBy Bertingkat

Sarang-kan pemanggilan groupingBy untuk klasifikasi multidimensi:

record Employee(String name, String dept, String level) {}
List<Employee> emps = List.of(
    new Employee("A","Eng","Junior"), new Employee("B","Eng","Senior"),
    new Employee("C","HR","Junior"), new Employee("D","HR","Senior")
);

Map<String, Map<String, List<Employee>>> grouped =
    emps.stream().collect(
        Collectors.groupingBy(Employee::dept,
            Collectors.groupingBy(Employee::level))
    );
grouped.forEach((dept, levels) -> levels.forEach((level, list) ->
    System.out.println(dept+"/"+level+": "+list.size())));

Mengontrol Jenis Map

Secara default, groupingBy menghasilkan HashMap. Gunakan bentuk overload dengan 3 argumen untuk menentukan jenis map yang berbeda, seperti TreeMap untuk kunci yang terurut:

Map<String, Long> sorted =
    people.stream().collect(
        Collectors.groupingBy(Person::city, TreeMap::new, Collectors.counting())
    );
System.out.println(sorted); // keys in alphabetical order

Kolektor Hilir: averagingInt

Hitung rata-rata untuk setiap grup:

record Product(String category, int price) {}
List<Product> products = List.of(
    new Product("A",10), new Product("A",20),
    new Product("B",15), new Product("B",25)
);

Map<String, Double> avgPrice =
    products.stream().collect(
        Collectors.groupingBy(Product::category,
            Collectors.averagingInt(Product::price))
    );
avgPrice.forEach((cat, avg) -> System.out.printf("%s: %.1f%n", cat, avg));

Kolektor Hilir: toUnmodifiableList

Gunakan Collectors.toUnmodifiableList() sebagai kolektor hilir untuk menghasilkan grup yang tidak dapat diubah:

Map<String, List<String>> immutable =
    people.stream().collect(
        Collectors.groupingBy(Person::city,
            Collectors.mapping(Person::name, Collectors.toUnmodifiableList()))
    );
// Attempting to modify throws UnsupportedOperationException

Kasus Nyata: Ringkasan Order

Kelompokkan order berdasarkan status dan jumlahkan nilainya untuk setiap grup:

record Order(String status, double amount) {}
List<Order> orders = List.of(
    new Order("PAID", 50.0), new Order("PENDING", 30.0),
    new Order("PAID", 75.0), new Order("CANCELLED", 20.0)
);

Map<String, Double> totalByStatus =
    orders.stream().collect(
        Collectors.groupingBy(Order::status,
            Collectors.summingDouble(Order::amount))
    );
totalByStatus.forEach((s, t) -> System.out.printf("%s: $%.2f%n", s, t));

Pertimbangan Performa

groupingBy mengumpulkan semua elemen ke dalam memori. Untuk kumpulan data yang sangat besar, pertimbangkan pemrosesan dalam beberapa bagian atau gunakan GROUP BY pada tingkat basis data. Kolektor hilir dijalankan untuk setiap elemen — buat kolektor tetap ringan untuk menghindari perilaku O(n²).

Menggabungkan dengan filter dan sorted

Rangkai operasi stream sebelum pengumpulan untuk memfilter atau mengurutkan data terlebih dahulu:

Map<String, Long> activeCities =
    people.stream()
          .filter(p -> !p.city().equals("Chicago"))
          .collect(Collectors.groupingBy(Person::city, Collectors.counting()));
System.out.println(activeCities); // {NYC=2, LA=2}

Pemeriksaan Singkat

Jenis apa yang dihasilkan oleh Collectors.groupingBy(Person::city) ketika digunakan bersama collect()?

Ringkasan: groupingBy

Poin-poin penting:

  • groupingBy(classifier) → Map<K, List<T>>
  • Gabungkan dengan kolektor hilir: counting, mapping, joining, dan peringkasan
  • Sarang-kan groupingBy untuk klasifikasi multidimensi
  • Gunakan bentuk overload dengan 3 argumen untuk mengontrol jenis map yang dihasilkan, misalnya TreeMap
Gratis untuk memulai

Belajar Java dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
104
Pelajaran
374

Pertanyaan yang Sering Diajukan

Apakah pelajaran “groupingBy: Mengelompokkan Elemen” gratis?

Ya — teks lengkap “groupingBy: Mengelompokkan Elemen” 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 “groupingBy: Mengelompokkan Elemen”?

Kelompokkan elemen stream ke dalam map berdasarkan fungsi pengelompokan dan rangkai dengan pengumpul lanjutan. 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 “groupingBy: Mengelompokkan Elemen” 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