Öncelike bir map örneğiyle başlayalım ve onu geliştirerek flatmap şekline çevirerek ilerleyelim.
Elimizde bir tamsayı değerler bulunduran bir liste olduğunu varsayalım ve bu listedeki bütün elemanların karelerini alarak yeni bir listeye atmak isteyelim. İlk olarak for döngüsü ile yapalım.
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> squares = new ArrayList<>();
for (int i : numbers) {
squares.add(i * i);
}
squares.forEach(System.out::println);
}
Sonra bunu java 8 streams kullanarak yapmayı deneyelim.
Bu şekilde bir kod parçası numbers.stream().map dediğimiz kısımda derleme hatası verecektir. Çünkü elimideki listede (numbers) sırasıyla numaralar yok. Onun yerine iç içe listeler var.
{
{1,2},
{3,4,5,6},
{7,8,9,0}
}
Bu şekilde bir liste için elemanların hepsini doğrusal bir şekilde (yanyana) almak için iki farklı kod yazabiliriz. Geleneksel for döngüsü ile şu şekilde olur
public static void main(String[] args) {
List<List<Integer>> numbers = new ArrayList<>();
numbers.add(Arrays.asList(1, 2));
numbers.add(Arrays.asList(3,4,5,6));
numbers.add(Arrays.asList(7,8,9,0));
List<Integer> squares = new ArrayList<Integer>();
for(List<Integer> l: numbers) {
for(Integer i : l) {
squares.add(i * i);
}
}
squares.forEach(System.out::println);
}
En nihayetinde kodumuzu azaltmak vedaha okunur yapmak için flatmap kullanabiliriz. O da şöyle oluyor.
Unutmamamız gereken flatmap uyguladığımız zaman elimizdeki bütün elemanlar bir listeye eklenmiş gibi davranacak, bu problemde sayıların karesini almak için yine map uygulamamız gerekiyor.
Öncelike bir map örneğiyle başlayalım ve onu geliştirerek flatmap şekline çevirerek ilerleyelim.
Elimizde bir tamsayı değerler bulunduran bir liste olduğunu varsayalım ve bu listedeki bütün elemanların karelerini alarak yeni bir listeye atmak isteyelim. İlk olarak for döngüsü ile yapalım.
Sonra bunu java 8 streams kullanarak yapmayı deneyelim.
Buraya kadar güzel. Peki elimizdeki sayılar birden fazla listenin birleştirilmesiyle yapılsaydı nasıl olurdu?
Bu şekilde bir kod parçası numbers.stream().map dediğimiz kısımda derleme hatası verecektir. Çünkü elimideki listede (numbers) sırasıyla numaralar yok. Onun yerine iç içe listeler var.
Bu şekilde bir liste için elemanların hepsini doğrusal bir şekilde (yanyana) almak için iki farklı kod yazabiliriz. Geleneksel for döngüsü ile şu şekilde olur
En nihayetinde kodumuzu azaltmak vedaha okunur yapmak için flatmap kullanabiliriz. O da şöyle oluyor.
Unutmamamız gereken flatmap uyguladığımız zaman elimizdeki bütün elemanlar bir listeye eklenmiş gibi davranacak, bu problemde sayıların karesini almak için yine map uygulamamız gerekiyor.
Burda da resim ile anlatılmaya çalışılmış.