collect groupingBy
- Java kursu
- İleri seviye
- Ders 1/82
- 5 dk
Collectors.groupingBy ile gruplamayı öğrenirsin.
Akışı gruplara ayırma
Bir akışı (stream) sonlandırmak için collect yöntemi kullanılır. Collectors sınıfı bu iş için hazır toplayıcılar (collector) sunar. Bunların en yaygını groupingBy'dur: elemanları bir sınıflandırıcı işleve göre kümeye ayırır.
Örnek: products.stream().collect(Collectors.groupingBy(Product::category)). Burada her ürün kategori adına göre bir gruba konur; sonuç Map<String, List<Product>> türünde olur. Anahtarlar kategoriler, değerler ise o kategorideki ürün listesidir.
groupingBy çıktısı ve sıralı harita
Varsayılan olarak groupingBy bir HashMap döndürür; anahtarların sırası belirsizdir. Çıktıyı belirleyici yapmak için üç parametreli aşırı yüklemeyi kullanırsın: sınıflandırıcı, harita sağlayıcısı ve bir alt toplayıcı.
Örnek: Collectors.groupingBy(Product::category, TreeMap::new, Collectors.toList()). TreeMap::new anahtarları doğal sırayla tutar; böylece forEach çıktısı her çalışmada aynı olur. Alt toplayıcı yerine Collectors.counting() kullanırsan her grup için adet alırsın.
Uygulama Ürünleri kategoriye göre grupla
Üç üründen oluşan bir liste oluştur (record Product(String name, String category, double price)). Akışı Collectors.groupingBy ile kategoriye göre grupla; sıralı çıktı için TreeMap::new ve Collectors.toList() sağlayıcısını ver. Sonra forEach ile her kategorinin adedini System.out.println ile yazdır.
Başlangıç kodu
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
record Product(String name, String category, double price) {}
// Ürünleri kategoriye göre grupla
// Collectors.groupingBy ve TreeMap sağlayıcısı kullan
// Her kategorinin adedini forEach ile yazdırÖrnek çözüm
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
record Product(String name, String category, double price) {}
public class GroupByCategory {
public static void main(String[] args) {
List<Product> products = List.of(
new Product("Kalem", "Kirtasiye", 12.5),
new Product("Defter", "Kirtasiye", 25.0),
new Product("Ekmek", "Market", 5.0)
);
Map<String, List<Product>> byCategory = products.stream()
.collect(Collectors.groupingBy(Product::category, TreeMap::new, Collectors.toList()));
byCategory.forEach((k, v) -> System.out.println(k + ": " + v.size()));
}
}Beklenen çıktı
Kirtasiye: 2 Market: 1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Hangi toplayıcı bir akışı bir sınıflandırıcı işleve göre gruplara ayırır?
- Collectors.groupingBy(...) Doğru cevap
- Collectors.toList(...)
- Stream.of(...)
- Optional.of(...)
Açıklama: groupingBy elemanları sınıflandırıcıya göre gruplar.
2 groupingBy çağrısını tamamla
Map<String, List<Product>> byCat = products.stream()
.collect(Collectors.groupingBy(____));
Map<String, List<Product>> byCat = products.stream()
.collect(Collectors.groupingBy(Product::category));
Açıklama: Product::category bir yöntem referansıdır ve sınıflandırıcı olarak çalışır.
3 groupingBy kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
groupingBy |
Anahtara göre gruplar |
classifier |
Sınıflandırıcı işlev |
collect |
Sonlandırıcı yöntem |
TreeMap::new |
Sıralı harita sağlayıcısı |