Java Academy · Pelajaran

partitioningBy dan counting

Bahagikan strim kepada dua kumpulan dengan partitioningBy dan kira elemen dengan counting.

Pelajaran 2 daripada 413 langkah

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 op

counting() 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: 3

Membahagikan 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));  // 2

Peta 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)
Percuma untuk bermula

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

  1. groupingBy: Mengelaskan Elemen
  2. partitioningBy dan counting
  3. toMap, joining dan summarizing
  4. Membina Pengumpul Tersuai
← Kembali ke Java Academy