0Pricing
Java Academy · Ders

groupingBy: Öğeleri Sınıflandırma

Akış öğelerini bir sınıflandırıcı işleviyle haritalar halinde gruplayın ve alt toplayıcılarla birleştirin.

groupingBy: Öğeleri Sınıflandırma, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 1. 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.

groupingBy nedir?

Collectors.groupingBy(), stream öğelerini her anahtarın eşleşen öğelerden oluşan bir listeye karşılık geldiği bir Map içinde bölümlere ayırır. SQL'deki GROUP BY işleminin stream karşılığıdır.

import java.util.*;
import java.util.stream.*;

record Person(String name, String city) {}
List<Person> people = List.of(
    new Person("Alice","NYC"), new Person("Bob","LA"),
    new Person("Carol","NYC"), new Person("Dave","LA"),
    new Person("Eve","Chicago")
);

Map<String, List<Person>> byCity =
    people.stream().collect(Collectors.groupingBy(Person::city));
byCity.forEach((city, ps) -> System.out.println(city + ": " + ps.size()));

Alt Toplayıcı: counting

Listelemek yerine toplamak için groupingBy ile bir alt toplayıcıyı birleştirin:

Map<String, Long> countByCity =
    people.stream().collect(
        Collectors.groupingBy(Person::city, Collectors.counting())
    );
countByCity.forEach((city, n) -> System.out.println(city + " -> " + n));
// NYC -> 2, LA -> 2, Chicago -> 1

Alt Toplayıcı: mapping

Öğeleri toplamadan önce dönüştürmek için Collectors.mapping() işlevini alt toplayıcı olarak kullanın:

Map<String, List<String>> namesByCity =
    people.stream().collect(
        Collectors.groupingBy(
            Person::city,
            Collectors.mapping(Person::name, Collectors.toList())
        )
    );
namesByCity.forEach((city, names) -> System.out.println(city + ": " + names));

Alt Toplayıcı: joining

Her gruptaki adları virgülle ayrılmış tek bir metinde birleştirin:

Map<String, String> joinedByCity =
    people.stream().collect(
        Collectors.groupingBy(
            Person::city,
            Collectors.mapping(Person::name, Collectors.joining(", "))
        )
    );
joinedByCity.forEach((city, s) -> System.out.println(city + ": " + s));
// NYC: Alice, Carol

Çok Düzeyli groupingBy

Çok boyutlu sınıflandırma için groupingBy çağrılarını iç içe yerleştirin:

record Employee(String name, String dept, String level) {}
List<Employee> emps = List.of(
    new Employee("A","Eng","Junior"), new Employee("B","Eng","Senior"),
    new Employee("C","HR","Junior"), new Employee("D","HR","Senior")
);

Map<String, Map<String, List<Employee>>> grouped =
    emps.stream().collect(
        Collectors.groupingBy(Employee::dept,
            Collectors.groupingBy(Employee::level))
    );
grouped.forEach((dept, levels) -> levels.forEach((level, list) ->
    System.out.println(dept+"/"+level+": "+list.size())));

Map Türünü Denetleme

Varsayılan olarak groupingBy bir HashMap üretir. Sıralanmış anahtarlar için TreeMap gibi farklı bir eşlem türü belirtmek üzere 3 bağımsız değişkenli aşırı yüklenmiş sürümü kullanın:

Map<String, Long> sorted =
    people.stream().collect(
        Collectors.groupingBy(Person::city, TreeMap::new, Collectors.counting())
    );
System.out.println(sorted); // keys in alphabetical order

Alt Toplayıcı: averagingInt

Her grup için ortalamaları hesaplayın:

record Product(String category, int price) {}
List<Product> products = List.of(
    new Product("A",10), new Product("A",20),
    new Product("B",15), new Product("B",25)
);

Map<String, Double> avgPrice =
    products.stream().collect(
        Collectors.groupingBy(Product::category,
            Collectors.averagingInt(Product::price))
    );
avgPrice.forEach((cat, avg) -> System.out.printf("%s: %.1f%n", cat, avg));

Alt Toplayıcı: toUnmodifiableList

Değişmez gruplar oluşturmak için alt toplayıcı olarak Collectors.toUnmodifiableList() kullanın:

Map<String, List<String>> immutable =
    people.stream().collect(
        Collectors.groupingBy(Person::city,
            Collectors.mapping(Person::name, Collectors.toUnmodifiableList()))
    );
// Attempting to modify throws UnsupportedOperationException

Gerçek Kullanım Örneği: Sipariş Özeti

Siparişleri duruma göre gruplayın ve her grubun tutarlarını toplayın:

record Order(String status, double amount) {}
List<Order> orders = List.of(
    new Order("PAID", 50.0), new Order("PENDING", 30.0),
    new Order("PAID", 75.0), new Order("CANCELLED", 20.0)
);

Map<String, Double> totalByStatus =
    orders.stream().collect(
        Collectors.groupingBy(Order::status,
            Collectors.summingDouble(Order::amount))
    );
totalByStatus.forEach((s, t) -> System.out.printf("%s: $%.2f%n", s, t));

Performansla İlgili Hususlar

groupingBy tüm öğeleri bellekte toplar. Çok büyük veri kümelerinde verileri parçalar hâlinde işlemeyi veya veritabanı düzeyinde bir GROUP BY kullanmayı düşünün. Alt toplayıcı her öğe için çalıştırılır; O(n²) davranışından kaçınmak için onu hafif tutun.

filter ve sorted ile Birleştirme

Verileri toplamadan önce ön filtreleme veya ön sıralama yapmak için stream işlemlerini zincirleyin:

Map<String, Long> activeCities =
    people.stream()
          .filter(p -> !p.city().equals("Chicago"))
          .collect(Collectors.groupingBy(Person::city, Collectors.counting()));
System.out.println(activeCities); // {NYC=2, LA=2}

Hızlı Kontrol

Collectors.groupingBy(Person::city), collect() ile kullanıldığında hangi türü üretir?

Özet: groupingBy

Temel çıkarımlar:

  • groupingBy(classifier) → Map<K, List<T>>
  • Alt toplayıcılarla birleştirin: counting, mapping, joining, summarizing
  • Çok boyutlu sınıflandırma için groupingBy çağrılarını iç içe yerleştirin
  • Sonuçta oluşan eşlem türünü denetlemek için 3 bağımsız değişkenli aşırı yüklenmiş sürümü kullanın (ör. TreeMap)

Sıkça Sorulan Sorular

“groupingBy: Öğeleri Sınıflandırma” dersi ücretsiz mi?

Evet — “groupingBy: Öğeleri Sınıflandırma” 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.

“groupingBy: Öğeleri Sınıflandırma” dersinde ne öğreneceğim?

Akış öğelerini bir sınıflandırıcı işleviyle haritalar halinde gruplayın ve alt toplayıcılarla birleştirin. 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 1. dersidir.

“groupingBy: Öğeleri Sınıflandırma” 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

  1. groupingBy: Öğeleri Sınıflandırma
  2. partitioningBy ve counting
  3. toMap, joining ve summarizing
  4. Özel Bir Toplayıcı Oluşturma
← Java Academy Sayfasına Dön