flatMap
- Java kursu
- İleri seviye
- Ders 5/82
- 5 dk
flatMap ile iç içe akışları düzleştirmeyi öğrenirsin.
Akışı düzleştirme: flatMap
map her elemanı birebir yeni bir değere çevirir. flatMap ise her elemanı birden çok elemanlı bir akışa çevirir ve bu akışları tek bir akışta birleştirir. İç içe listeleri düzleştirmek için kullanılır.
Örnek: lists.stream().flatMap(List::stream). Burada her iç liste bir akışa çevrilir, sonra bu akışlar tek bir akış olarak birleştirilir. Sonuç Stream<Integer> olur; tüm iç listelerin elemanlarını sırayla içerir.
flatMap ile yaygın desenler
flatMap'in en sık kullanıldığı iki durum vardır: iç içe koleksiyonları düzleştirmek ve bir nesneden birden çok değer üretmek.
Örnek: bir Order nesnesinin items listesi varsa, orders.stream().flatMap(o -> o.items().stream()) tüm siparişlerin tüm kalemlerini tek bir akışta verir. Başka bir örnek: bir dizgiyi karakter akışına açmak için str.chars().mapToObj(c -> (char) c) kullanılır; bu da bire-çok bir dönüşümdür.
Uygulama İç içe listeleri düzleştir
Üç iç listeden oluşan bir List<List<Integer>> oluştur: List.of(1, 2, 3), List.of(4, 5), List.of(6). Akışı flatMap(List::stream) ile düzleştir, toList ile topla. Sonra her elemanı ayrı satırda System.out::println ile yazdır.
Başlangıç kodu
import java.util.List;
// İç içe listeleri düzleştir
// flatMap ile her iç listeyi akışa aç
// Her elemanı ayrı satırda yazdırÖrnek çözüm
import java.util.List;
public class FlattenLists {
public static void main(String[] args) {
List<List<Integer>> nested = List.of(
List.of(1, 2, 3),
List.of(4, 5),
List.of(6)
);
List<Integer> flat = nested.stream()
.flatMap(List::stream)
.toList();
flat.forEach(System.out::println);
}
}Beklenen çıktı
1 2 3 4 5 6
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 map ve flatMap farkını eşleştir
| Kavram | Anlamı |
|---|---|
map |
Birebir dönüşüm |
flatMap |
Bire-çok dönüşüm |
List::stream |
İç listeyi akışa açar |
Stream.of |
Akış oluşturur |
2 İç içe listeleri tek bir akışta birleştirmek için hangi yöntem kullanılır?
- flatMap Doğru cevap
- map
- filter
- reduce
Açıklama: FlatMap. İç içe akışları düzleştirir.
3 flatMap çağrısını tamamla
List<Integer> flat = nested.stream()
.flatMap(____)
.toList();
List<Integer> flat = nested.stream()
.flatMap(List::stream)
.toList();
Açıklama: List::stream her iç listeyi akışa açar.