İç İçe Koleksiyonlar için flatMap
İç içe listeleri, Optional zincirlerini ve dosya-satır yapılarını flatMap kullanarak düzleştirin.
İç İçe Koleksiyonlar için flatMap, 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.
İç İçe Koleksiyon Sorunu
Bir akışın her öğesi başka bir koleksiyona eşlendiğinde map size bir Stream<List<T>> verir. flatMap, iç akışları tek bir düz Stream<T> içinde birleştirir.
List<List<Integer>> nested = List.of(List.of(1,2), List.of(3,4), List.of(5));
// With map:
Stream<List<Integer>> s = nested.stream().map(l -> l); // Stream<List<Integer>>
// With flatMap:
Stream<Integer> flat = nested.stream().flatMap(List::stream); // Stream<Integer>
flat.forEach(System.out::println); // 1 2 3 4 5flatMap ile map Karşılaştırması
map(f), f işlevini her öğeye uygular ve sonucu sarmalar. flatMap(f), bir akış döndüren f işlevini uygular, ardından bu akışların tümünü tek bir akışta birleştirir.
// map: List<String> -> Stream<Stream<Character>>
Stream<Stream<Character>> nested = List.of("hi","bye").stream()
.map(s -> s.chars().mapToObj(c -> (char)c));
// flatMap: List<String> -> Stream<Character>
Stream<Character> flat = List.of("hi","bye").stream()
.flatMap(s -> s.chars().mapToObj(c -> (char)c));Siparişleri ve Öğeleri Düzleştirme
Klasik kullanım: her siparişte bir öğe listesi bulunur. Tüm siparişlerdeki tüm öğelerin düz bir akışını elde edin.
List<String> allItems = orders.stream()
.flatMap(order -> order.getItems().stream())
.collect(Collectors.toList());
System.out.println(allItems);Optional ile flatMap
Optional'ı 0 veya 1 öğeli bir akışa dönüştürmek için (Java 9 ve sonrası) üzerinde stream() kullanın. Ardından flatMap, Stream<Optional<T>> türünü Stream<T> türüne indirger.
List<Optional<String>> maybes = List.of(Optional.of("a"), Optional.empty(), Optional.of("c"));
List<String> values = maybes.stream()
.flatMap(Optional::stream) // Java 9+
.collect(Collectors.toList());
System.out.println(values); // [a, c]Birden Çok Dosyadan Tüm Satırları Okuma
flatMap, iç içe döngüler kullanmadan bir dosya listesindeki tüm satırları tek bir akışta birleştirmeyi kolaylaştırır.
List<Path> files = List.of(Path.of("a.txt"), Path.of("b.txt"));
List<String> allLines = files.stream()
.flatMap(p -> {
try { return Files.lines(p); }
catch (IOException e) { return Stream.empty(); }
})
.collect(Collectors.toList());Dizeleri Sözcüklere Ayırma
Her cümleyi sözcüklere ayırın ve sözcük sıklığı sayımı için tüm sözcükleri tek bir akışta düzleştirin.
List<String> sentences = List.of("hello world", "java streams rock");
Map<String, Long> freq = sentences.stream()
.flatMap(s -> Arrays.stream(s.split("\\s+")))
.collect(Collectors.groupingBy(w -> w, Collectors.counting()));
System.out.println(freq);Map.entrySet ile flatMap
Kategori listesinden öğelere eşleme yapan bir haritayı, tüm öğelerden oluşan bir akışa düzleştirin.
Map<String, List<String>> catalog = Map.of(
"fruit", List.of("apple","banana"),
"veg", List.of("carrot","pea"));
List<String> all = catalog.values().stream()
.flatMap(List::stream)
.sorted()
.collect(Collectors.toList());
System.out.println(all); // [apple, banana, carrot, pea]flatMap'te NullPointerException'dan Kaçınma
İşlev bir akış yerine null döndürebiliyorsa, NullPointerException oluşmasını önlemek için null denetimi yapın veya Stream.empty() döndürün.
departments.stream()
.flatMap(dept -> dept.getEmployees() == null
? Stream.empty()
: dept.getEmployees().stream())
.forEach(System.out::println);flatMap ile Farklı Sözcükleri Sayma
Kısa ve öz veri işleme için flatMap, distinct ve count kodlarını birleştirin.
long distinctWords = sentences.stream()
.flatMap(s -> Arrays.stream(s.toLowerCase().split("[^a-z]+")))
.filter(w -> !w.isEmpty())
.distinct()
.count();
System.out.println("Distinct: " + distinctWords);İlkel Akışlar için flatMapToInt
İlkel akışlara düzleştirme yaparken kutulamayı önlemek için flatMapToInt, flatMapToLong ve flatMapToDouble kullanın.
int totalQuantity = orders.stream()
.flatMapToInt(order -> order.getItems().stream().mapToInt(Item::getQuantity))
.sum();
System.out.println("Total qty: " + totalQuantity);Performans Notu
Her flatMap çağrısı bir akış katmanı ekler. Çok sayıda küçük iç koleksiyon içeren çok büyük veri kümelerinde, nesne oluşturma ek yükünü azaltmak için yinelemeli yaklaşımları veya Spliterator'ı değerlendirin.
Kısa Kontrol
flatMap, map'ten farklı olarak ne yapar?
Özet
flatMap, her öğeyi bir akışa dönüştürür ve tüm akışları tek bir akışta birleştirir. İç içe koleksiyonları düzleştirmek, Optional'ları zincirlemek, dizeleri bölmek ve birden çok dosyayı okumak için kullanın. Kutulamayı önlemek için flatMapToInt kullanın.
Sıkça Sorulan Sorular
“İç İçe Koleksiyonlar için flatMap” dersi ücretsiz mi?
Evet — “İç İçe Koleksiyonlar için flatMap” 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.
“İç İçe Koleksiyonlar için flatMap” dersinde ne öğreneceğim?
İç içe listeleri, Optional zincirlerini ve dosya-satır yapılarını flatMap kullanarak düzleş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.
“İç İçe Koleksiyonlar için flatMap” 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
- İç İçe Koleksiyonlar için flatMap
- Paralel Akışlar: Performans ve Tuzaklar
- Spliterator: Paralellik için Bölme
- iterate ve generate ile Sonsuz Akışlar