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 opcounting() 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: 3Mempartisi 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)); // 2Map 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
- groupingBy: Mengelompokkan Elemen
- partitioningBy dan counting
- toMap, joining, dan summarizing
- Membangun Collector Kustom