CodeBlanks Logo Icon CodeBlanks

Özet - Stream ileri

groupingBy, reduce ve flatMap'i birleştirerek bir satış özetleyici yazarsın.

Özet - Stream ileri

Bu grupta beş ileri toplayıcıyı gördün. groupingBy elemanları bir anahtara göre gruplar; partitioningBy iki kümeye böler; joining dizgileri birleştirir; reduce tek değere indirger; flatMap iç içe akışları düzleştirir.

Bunları birleştirmek güçlü çözümler üretir. Örneğin groupingBy içine counting vererek grup adetleri alabilir; flatMap ardından reduce çağırarak iç içe yapılardan tek toplam üretebilirsin. Bu kombinasyonlar kodu kısa ve okunaklı tutar.

Uygulama Kategori adetlerini groupingBy + counting ile bul

Dört üründen oluşan bir liste oluştur (record Product(String name, String category, double price)): iki Kırtasiye, iki Market. Collectors.groupingBy(Product::category, TreeMap::new, Collectors.counting()) ile her kategorinin adedini Map<String, Long> olarak al. Sonra forEach ile her kategoriyi ve adedini 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 ve say
// groupingBy + counting + TreeMap kullan
// Her kategorinin adedini 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 CategoryCounts {
    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),
            new Product("Süt", "Market", 15.0)
        );
        Map<String, Long> counts = products.stream()
            .collect(Collectors.groupingBy(Product::category, TreeMap::new, Collectors.counting()));
        counts.forEach((k, v) -> System.out.println(k + ": " + v));
    }
}

Beklenen çıktı

Kirtasiye: 2
Market: 2

Hangi toplayıcı ne zaman?

Doğru toplayıcıyı seçmek soruya bağlıdır. Kategorilere ayırmak için groupingBy; tek koşula göre ikiye bölmek için partitioningBy; dizgileri birleştirmek için joining; tek değer üretmek için reduce; iç içe yapıları düzleştirmek için flatMap kullanılır.

Bu toplayıcıları zincirlemek de mümkündür. Önce flatMap ile iç içe veriyi aç, sonra reduce ile tek sonuca indir. Bu yaklaşım, çok adımlı veri işleme görevlerini tek bir akış zincirinde çözer.

Uygulama İç içe siparişleri flatMap + reduce ile topla

Üç iç listeden oluşan bir List<List<Double>> oluştur: List.of(12.5, 25.0), List.of(5.0, 8.0), List.of(30.0). Akışı flatMap(List::stream) ile düzleştir, ardından reduce(0.0, Double::sum) ile topla. Sonucu System.out.println ile yazdır.

Başlangıç kodu

Main.java
import java.util.List;

// Sipariş listelerini düzleştir
// flatMap ile aç, reduce ile topla
// Toplamı yazdır

Örnek çözüm

Main.java
import java.util.List;

public class SumAllPrices {
    public static void main(String[] args) {
        List<List<Double>> orders = List.of(
            List.of(12.5, 25.0),
            List.of(5.0, 8.0),
            List.of(30.0)
        );
        double total = orders.stream()
            .flatMap(List::stream)
            .reduce(0.0, Double::sum);
        System.out.println(total);
    }
}

Beklenen çıktı

80.5

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Hangi toplayıcı elemanları iki kümeye böler ve Map<Boolean, List<T>> döndürür?

  • Collectors.groupingBy
  • Collectors.partitioningBy Doğru cevap
  • Collectors.joining
  • Collectors.toList

Açıklama: partitioningBy tek bir koşula göre iki küme üretir.

2 Toplayıcıyı çıktı türüyle eşleştir

Kavram Anlamı
groupingBy Map<K, List<T>>
partitioningBy Map<Boolean, List<T>>
joining String
reduce(identity, op) T

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