Java
Ö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.
Örnek çözümü göster
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));
}
}
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.
Örnek çözümü göster
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);
}
}
Kendini test et
-
Hangi toplayıcı elemanları iki kümeye böler ve Map<Boolean, List<T>> döndürür?
- Collectors.groupingBy
- Collectors.partitioningBy
- Collectors.joining
- Collectors.toList
Cevabı göster
Collectors.partitioningBy — partitioningBy tek bir koşula göre iki küme üretir.
-
Toplayıcıyı çıktı türüyle eşleştir
- groupingBy
- Map<K, List<T>>
- partitioningBy
- Map<Boolean, List<T>>
- joining
- String
- reduce(identity, op)
- T
Sıradaki ders: Optional.of