partitioningBy ve counting
partitioningBy ile bir akışı iki gruba ayırın ve counting ile öğeleri sayın.
partitioningBy ve counting, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
partitioningBy Temelleri
Collectors.partitioningBy(predicate), bir stream'i tam olarak iki gruba — true ve false — böler ve Map<Boolean, List<T>> döndürür.
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 ve filter Karşılaştırması
filter işlevinin aksine partitioningBy her iki grubu aynı anda korur; bölümlemenin her iki yarısına da ihtiyaç duyduğunuzda kullanışlıdır.
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());partitioningBy ile Alt Toplayıcı
partitioningBy işlevini tıpkı groupingBy gibi bir alt toplayıcıyla birleştirin:
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));counting() Toplayıcısı
Collectors.counting(), stream'deki (veya alt gruptaki) öğelerin sayısını hesaplar. reducing(0L, e -> 1L, Long::sum) ifadesinin pratik eşdeğeridir.
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 opAlt Toplayıcı Olarak counting()
counting(), groupingBy/partitioningBy için alt toplayıcı olarak kullanıldığında özellikle etkilidir:
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: 3Adlara Bölümleme
mapping alt toplayıcısını kullanarak her bölümden adları çıkarın:
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));counting ile summarizingInt Birleştirmesi
Collectors.summarizingInt(), tek geçişte count, sum, min, max ve average değerlerini hesaplar:
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());Gerçek Kullanım Örneği: A/B Testi Bölümlemesi
A/B testi için kullanıcıları kontrol ve uygulama gruplarına bölün:
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)); // 2groupingBy + counting ile Sıklık Eşlemi
Her öğenin oluşum sayısını hesaplayın (kelime sıklığı eşlemi):
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 Her Zaman Her İki Anahtarı da Döndürür
groupingBy işlevinin aksine partitioningBy, gruplardan biri boş olsa bile her zaman hem true hem de false anahtarlarını içeren bir eşlem döndürür. Bu, map.get(true) üzerinde NullPointerExceptions oluşmasını önler.
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]Performans: Tek Geçiş
Hem partitioningBy hem de counting tek bir stream geçişinde çalışır — O(n). Sıralama gerektirmezler. Bu nedenle filter işlevini iki kez çağırmaktan veya gruplamadan önce sıralama yapmaktan çok daha verimlidirler.
Hızlı Kontrol
Collectors.partitioningBy(predicate) ifadesinin dönüş türü nedir?
Özet: partitioningBy ve counting
Temel çıkarımlar:
- partitioningBy tam olarak iki gruba (true/false) böler
- Her iki anahtar da her zaman bulunur; groupingBy'nin aksine NPE riski yoktur
- counting() öğeleri sayar; gruplar için alt toplayıcı olarak kullanın
- summarizingInt/Long/Double, tek geçişte count+sum+min+max+avg değerlerini sağlar
- Tümü tek bir O(n) stream geçişinde çalışır
Sıkça Sorulan Sorular
“partitioningBy ve counting” dersi ücretsiz mi?
Evet — “partitioningBy ve counting” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“partitioningBy ve counting” dersinde ne öğreneceğim?
partitioningBy ile bir akışı iki gruba ayırın ve counting ile öğeleri sayın. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“partitioningBy ve counting” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- groupingBy: Öğeleri Sınıflandırma
- partitioningBy ve counting
- toMap, joining ve summarizing
- Özel Bir Toplayıcı Oluşturma