CodeBlanks Logo Icon CodeBlanks

collect groupingBy

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

Main.java
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

Main.java
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

Soru
Map<String, List<Product>> byCat = products.stream()
    .collect(Collectors.groupingBy(____));
Cevap
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ı

İleri seviye bölümündeki tüm dersler