Özet - Stream ileri
- Java kursu
- İleri seviye
- Ders 6/82
- 5 dk
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
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
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
import java.util.List;
// Sipariş listelerini düzleştir
// flatMap ile aç, reduce ile topla
// Toplamı yazdırÖrnek çözüm
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 |