0Pricing
Java Academy · Pelajaran

partitioningBy dan counting

Pisahkan stream menjadi dua kelompok dengan partitioningBy dan hitung elemen dengan counting.

partitioningBy dan counting adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 partitioningBy

Collectors.partitioningBy(predicate) membagi stream menjadi tepat dua grup — true dan false — lalu mengembalikan Map<Boolean, List<T>>.

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

List<Integer> nums = List.of(1,2,3,4,5,6,7,8,9,10);

Map<Boolean, List<Integer>> evenOdd =
    nums.stream().collect(Collectors.partitioningBy(n -> n % 2 == 0));

System.out.println(evenOdd.get(true));  // [2, 4, 6, 8, 10]
System.out.println(evenOdd.get(false)); // [1, 3, 5, 7, 9]

partitioningBy vs filter

Berbeda dari filter, partitioningBy mempertahankan kedua grup secara bersamaan — berguna ketika Anda memerlukan kedua bagian hasil partisi.

record Student(String name, int score) {}
List<Student> students = List.of(
    new Student("Alice",90), new Student("Bob",55),
    new Student("Carol",72), new Student("Dave",48)
);

Map<Boolean, List<Student>> result =
    students.stream().collect(
        Collectors.partitioningBy(s -> s.score() >= 60)
    );
System.out.println("Passed: " + result.get(true).size());
System.out.println("Failed: " + result.get(false).size());

Kolektor Hilir dengan partitioningBy

Gabungkan partitioningBy dengan kolektor hilir, sama seperti groupingBy:

Map<Boolean, Long> passFailCount =
    students.stream().collect(
        Collectors.partitioningBy(
            s -> s.score() >= 60,
            Collectors.counting()
        )
    );
System.out.println("Passed: " + passFailCount.get(true));
System.out.println("Failed: " + passFailCount.get(false));

Kolektor counting()

Collectors.counting() menghitung jumlah elemen dalam stream (atau grup hilir). Ini merupakan bentuk praktis yang setara dengan reducing(0L, e -> 1L, Long::sum).

long count = Stream.of("a","bb","ccc","dddd")
    .collect(Collectors.counting());
System.out.println(count); // 4

// Same as:
long count2 = Stream.of("a","bb","ccc","dddd").count();
// Use counting() as a downstream; use .count() as a terminal op

counting() sebagai Kolektor Hilir

counting() sangat berguna sebagai kolektor hilir untuk groupingBy/partitioningBy:

List<String> words = List.of("cat","dog","car","door","cup","dune");

Map<Character, Long> byFirstLetter =
    words.stream().collect(
        Collectors.groupingBy(w -> w.charAt(0), Collectors.counting())
    );
byFirstLetter.forEach((c, n) -> System.out.println(c + ": " + n));
// c: 3, d: 3

Mempartisi Menjadi Nama

Ekstrak nama dari setiap partisi menggunakan kolektor hilir mapping:

Map<Boolean, List<String>> namesByPass =
    students.stream().collect(
        Collectors.partitioningBy(
            s -> s.score() >= 60,
            Collectors.mapping(Student::name, Collectors.toList())
        )
    );
System.out.println("Passed: " + namesByPass.get(true));
System.out.println("Failed: " + namesByPass.get(false));

Menggabungkan counting dengan summarizingInt

Collectors.summarizingInt() menghitung jumlah, total, minimum, maksimum, dan rata-rata dalam satu lintasan:

IntSummaryStatistics stats =
    students.stream().collect(
        Collectors.summarizingInt(Student::score)
    );
System.out.println("Count: " + stats.getCount());
System.out.println("Average: " + stats.getAverage());
System.out.println("Max: " + stats.getMax());
System.out.println("Min: " + stats.getMin());

Kasus Nyata: Pembagian Pengujian A/B

Partisi pengguna menjadi grup kontrol/perlakuan untuk pengujian A/B:

record User(String id, boolean isInTreatment) {}
List<User> users = List.of(
    new User("u1",true), new User("u2",false),
    new User("u3",true), new User("u4",false)
);

Map<Boolean, Long> split =
    users.stream().collect(
        Collectors.partitioningBy(User::isInTreatment, Collectors.counting())
    );
System.out.println("Treatment: " + split.get(true)); // 2
System.out.println("Control: " + split.get(false));  // 2

Map Frekuensi dengan groupingBy + counting

Hitung kemunculan setiap elemen (map frekuensi kata):

List<String> words2 = List.of("apple","banana","apple","cherry","banana","apple");

Map<String, Long> freq =
    words2.stream().collect(
        Collectors.groupingBy(w -> w, Collectors.counting())
    );
freq.entrySet().stream()
    .sorted(Map.Entry.<String,Long>comparingByValue().reversed())
    .forEach(e -> System.out.println(e.getKey()+": "+e.getValue()));

partitioningBy selalu mengembalikan kedua kunci

Berbeda dari groupingBy, partitioningBy selalu mengembalikan map dengan kunci true dan false — bahkan jika salah satu grup kosong. Ini mencegah NullPointerExceptions pada map.get(true).

List<Integer> allEven = List.of(2,4,6);
Map<Boolean, List<Integer>> m =
    allEven.stream().collect(Collectors.partitioningBy(n -> n % 2 != 0));
System.out.println(m.get(true));  // [] (empty, not null)
System.out.println(m.get(false)); // [2, 4, 6]

Performa: Satu Lintasan

Baik partitioningBy maupun counting bekerja dalam satu lintasan stream — O(n). Keduanya tidak memerlukan pengurutan. Karena itu, keduanya jauh lebih efisien daripada memanggil filter dua kali atau mengurutkan sebelum melakukan pengelompokan.

Pemeriksaan Singkat

Apa jenis nilai kembalian dari Collectors.partitioningBy(predicate)?

Ringkasan: partitioningBy dan counting

Poin-poin penting:

  • partitioningBy membagi menjadi tepat dua grup (true/false)
  • Kedua kunci selalu tersedia — tidak ada risiko NPE seperti pada groupingBy
  • counting() menghitung elemen; gunakan sebagai kolektor hilir untuk grup
  • summarizingInt/Long/Double memberikan jumlah+total+minimum+maksimum+rata-rata dalam satu lintasan
  • Semuanya bekerja dalam satu lintasan stream O(n)

Pertanyaan yang Sering Diajukan

Apakah pelajaran “partitioningBy dan counting” gratis?

Ya — teks lengkap “partitioningBy dan counting” 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 “partitioningBy dan counting”?

Pisahkan stream menjadi dua kelompok dengan partitioningBy dan hitung elemen dengan counting. 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 2 dari 4.

Berapa lama pelajaran “partitioningBy dan counting” 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