partitioningBy dan counting
Bahagikan strim kepada dua kumpulan dengan partitioningBy dan kira elemen dengan counting.
partitioningBy dan counting ialah pelajaran Java Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Java Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Asas partitioningBy
Collectors.partitioningBy(predicate) membahagikan strim kepada tepat dua kumpulan — 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 berbanding filter
Tidak seperti filter, partitioningBy mengekalkan kedua-dua kumpulan secara serentak — berguna apabila anda memerlukan kedua-dua bahagian pembahagian.
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());Pengumpul Hiliran dengan partitioningBy
Gabungkan partitioningBy dengan pengumpul hiliran 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));Pengumpul counting()
Collectors.counting() mengira bilangan elemen dalam strim atau kumpulan hiliran. Ia ialah padanan mudah bagi 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 Hiliran
counting() sangat berguna sebagai pengumpul hiliran 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: 3Membahagikan kepada Nama
Ekstrak nama daripada setiap bahagian menggunakan pengumpul hiliran 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() mengira bilangan, jumlah, minimum, maksimum dan purata 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());Kes Penggunaan Sebenar: Pecahan Ujian A/B
Bahagikan pengguna kepada kumpulan kawalan/rawatan untuk ujian 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)); // 2Peta Kekerapan dengan groupingBy + counting
Kira bilangan kemunculan setiap elemen, iaitu peta kekerapan perkataan:
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 sentiasa mengembalikan kedua-dua kunci
Tidak seperti groupingBy, partitioningBy sentiasa mengembalikan peta dengan kedua-dua kunci true dan false — walaupun salah satu kumpulan kosong. Hal ini mengelakkan 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]Prestasi: Satu Lintasan
Kedua-dua partitioningBy dan counting beroperasi dalam satu lintasan strim — O(n). Kedua-duanya tidak memerlukan pengisihan. Hal ini menjadikannya jauh lebih cekap daripada memanggil filter dua kali atau mengisih sebelum pengumpulan.
Semakan Ringkas
Apakah jenis pulangan bagi Collectors.partitioningBy(predicate)?
Ringkasan: partitioningBy dan counting
Perkara utama:
- partitioningBy membahagikan kepada tepat dua kumpulan, benar dan palsu
- Kedua-dua kunci sentiasa wujud — tiada risiko NPE seperti dalam groupingBy
- counting() mengira elemen; gunakannya sebagai pengumpul hiliran bagi kumpulan
- summarizingInt/jenis panjang/jenis perpuluhan memberikan bilangan, jumlah, minimum, maksimum dan purata dalam satu lintasan
- Semuanya beroperasi dalam satu lintasan strim O(n)
Pelajari Java dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 104
- Pelajaran
- 374
Soalan Lazim
Adakah pelajaran “partitioningBy dan counting” percuma?
Ya — teks penuh “partitioningBy dan counting” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Java Academy, tingkat taraf kepada CoddyKit PRO. Kursus Java Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “partitioningBy dan counting”?
Bahagikan strim kepada dua kumpulan dengan partitioningBy dan kira elemen dengan counting. Anda berlatih Java Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Java Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Java Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “partitioningBy dan counting” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- groupingBy: Mengelaskan Elemen
- partitioningBy dan counting
- toMap, joining dan summarizing
- Membina Pengumpul Tersuai