Java Stream'de map() ile flatMap() arasındaki farkın örnek bir senaryo ile anlatımı



Elbette, Java Stream API'de bulunan map ve flatMap metodları arasındaki farkı bir senaryo üzerinden açıklayabilirim. Öncelikle bu iki fonksiyonun genel tanımlarını yapalım:


map: Bu işlev, belirli bir fonksiyonu akışın (Stream) her bir elemanına uygular ve işlenmiş elemanlardan oluşan yeni bir akış oluşturur.

flatMap: Bu işlev, her bir girdi öğesini birden çok çıktı öğesiyle eşleyen bir işlevi uygular ve tüm çıktıları tek bir "düz" akışa (Stream) dönüştürür.

Senaryomuz ise bir kitaplık üzerine olsun:


java

Copy code

class Book {

    private String name;

    private List<String> authors;


    // constructor, getters, setters 

}

Diyelim ki, bir List<Book> koleksiyonunuz var ve her bir kitabın adını büyük harflerle elde etmek istiyorsunuz. İşte burada map fonksiyonunu kullanabiliriz.


java

Copy code

List<Book> books = //...

List<String> bookNames = books.stream()

                            .map(book -> book.getName().toUpperCase())

                            .collect(Collectors.toList());

map fonksiyonu, kitap adını alır ve büyük harflerle dönüştürür. Sonuç olarak, büyük harflerle kitap adlarının listesini alırız.


Şimdi, her bir kitabın yazarlarının listesini almak istediğimizi düşünelim. Burada flatMap kullanabiliriz çünkü her kitabın birden çok yazarı olabilir ve biz tüm yazarları tek bir liste haline getirmek istiyoruz.


java

Copy code

List<String> authors = books.stream()

                            .flatMap(book -> book.getAuthors().stream())

                            .collect(Collectors.toList());

flatMap, kitabın yazarlarının listesini alır ve bu listeleri tek bir liste haline getirir. Sonuç olarak, kitaplıkta bulunan tüm yazarların tek bir listesini elde ederiz.


Yani kısaca, map her bir elemanı tek bir elemana dönüştürürken, flatMap her bir elemanı birden çok elemana (ve bunları tek bir akış haline getirecek şekilde) dönüştürebilir.


Bir başka örnek


ChatGPT

Bu iki fonksiyonun farkını daha da açıkça görmek için birkaç örnek daha ele alalım.


Map örneği

Örneğin, bir sayı listesinin her elemanını karesi ile değiştirmek isteyelim:


java

Copy code

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

List<Integer> squares = numbers.stream()

                               .map(n -> n * n)

                               .collect(Collectors.toList());


System.out.println(squares); // [1, 4, 9, 16, 25]

Burada, map fonksiyonunu kullanarak her sayının karesini hesapladık ve sonuç olarak karelerin listesini elde ettik.


FlatMap örneği

Şimdi biraz daha karmaşık bir senaryoya bakalım. Diyelim ki bir List<List<Integer>> veri yapısına sahipsiniz ve bunu düz bir List<Integer> listesine dönüştürmek istiyorsunuz.


java

Copy code

List<List<Integer>> listOfLists = Arrays.asList(Arrays.asList(1, 2, 3), Arrays.asList(4, 5, 6));


List<Integer> flatList = listOfLists.stream()

                                    .flatMap(List::stream)

                                    .collect(Collectors.toList());


System.out.println(flatList); // [1, 2, 3, 4, 5, 6]

Burada, flatMap fonksiyonu, iç içe geçmiş listeleri düz bir listeye dönüştürdü. Her bir alt listeyi ayrı bir akışa dönüştürdü ve bunları tek bir akışa birleştirdi.


Sonuç olarak, map ve flatMap arasındaki temel fark, map'in her bir girdi öğesini tek bir çıktı öğesiyle eşlemesi, flatMap'in ise her girdi öğesini birden çok çıktı öğesiyle (bir akış) eşlemesi ve tüm çıktıları tek bir "düz" akışa dönüştürmesidir.

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال