Java 8 Stream Api Nedir ? Nasıl Kullanılır ? ( filter, sorted, map, reduce, distinct, count )

Muhammet Enes Akçayır
4 min readSep 5, 2021

--

Merhaba, bugün Java 8 ile gelip işlerimizi kolaylaştıran Stream API hakkında bilgi vermeye çalışacağım. Stream API hakkında bir çok yazı var, benim bunu yazma amacım biraz daha toplu bir Türkçe kaynak oluşturmak.

Java 8, verimli ve temiz uygulamalar oluşturmak için birçok yeni model getirdi. Java Stream API, Liste Dizi işlemek için işlevsel işlemler sağlar. Java Stream API, Java 8'e diğer birçok işlevsel programlama özelliğiyle eklendi. Listeler ve Dizilerde çok daha kolay ve temiz kod yazılarak işlem yapılabilmektedir.

Stream bir interface olduğundan dolayı doğrudan nesne almaz. Stream stream() ya da parallelStream() metodlarını çağırarak geriye Stream nesnesi döndürebilir. Bir Stream nesnesi oluşturur çeşitli operasyonlardan geçirirsek nesne ile birlikte geçirdiğimiz operasyonların tamamı Stream Pipeline olarak adlandırılır. int , double ve long için IntStream , DoubleStream ve LongStream şeklinde kullanımı bulunmaktadır.

stream() nedir?

Ardışık düzeni işlemek için tek bir iş parçacığı kullanan paralel olmayan stream. Açıkça paralel olarak belirtilmeyen herhangi bir stream işlemi, sıralı bir stream olarak değerlendirilir. Sıralı stream nesneleri, aynı işleme sistemi üzerine tek bir stream pipeline bağlanır, bu nedenle temel sistem paralel yürütmeyi desteklese bile, çok çekirdekli sistemin avantajından asla yararlanamaz. Sıralı stream işlemi tek tek gerçekleştirir.

parallelStream() nedir?

Paralel stream, performansını artıran çok çekirdekli işlemcilerden yararlanır. Paralel stream kullanarak, kodumuz sistemin ayrı çekirdeklerinde paralel olarak yürütülebilen birden çok stream a bölünür ve tüm bireysel çekirdeğin sonuçlarının birleşimi olarak gösterilir. Tüm programın paralelleştirilmesi her zaman gerekli değildir, ancak bazı bölümlerin paralelleştirilmesi gerekebilir. Daha net bir ifade ile bir sonraki elemanın işleme girmesi için şuan ki elemanın işlemden çıkması gerekmemektedir.

Streamler kullanılırken Java 8 ile birlikte gelen Lambda Expression Syntax’ı kullanılmaktadır.

Lambda Expression Syntax Kullanımı?

(argüman listesi) -> {gövde}

Java lambda ifadesi üç bileşenden oluşur.

1) Argüman listesi: Boş olabilir veya boş olmayabilir.

2) Ok belirteci: Argüman listesi ile ifade gövdesini birbirine bağlamak için kullanılır.

3) Gövde: Lambda ifadesi için ifadeler ve ifadeler içerir.

Parametre Sözdizimi Yok

() -> {

// parametresiz lambda gövdesi

}

Bir Parametre Sözdizimi

(p1) -> {

// Tek parametreli lambda gövdesi

}

İki Parametre Sözdizimi

(p1,p2) -> {

//Çok parametreli lambda gövdesi

}

Java Lambda
örnek Java Lambda Kullanım

Java Collections Nedir?

Java Collections depolama yapıp nesnelerin grubunu manipüle etmeye yönelik bir mimariyi sağlayan bir yapıdır.

Java Koleksiyonları, bir veri üzerinde yaptığınız arama, sıralama, ekleme, değiştirme ve silme gibi tüm işlemleri gerçekleştirebilir.

Java Collections Şema

Stream Api İşlemleri

filter()

Filtreleme işlemi yapmamızı sağlar, verilen kriterlere göre arama yapar. Bu filtreleme birden fazla şekilde de yapabilir. startsWith baş harfine göre arama yapar.

List<String> name = Arrays.asList("Muhammet", "Enes", "Akçayır");
List result = name.stream().filter(s -> s.startsWith("E")).collect(Collectors.toList());
System.out.println(result);

Çıktı

[Enes]

contains kelime içerisinde ki harfe göre arama yapar, burada iki filtreleme şeklini göstermek istedim. Kelime içerisinde a ve t harfi geçenleri filtreledim.

List<String> name = Arrays.asList("Muhammet", "Enes", "Akçayır");
List result = name.stream().filter(s -> (s.contains("a")) && (s.contains("t"))).collect(Collectors.toList());
System.out.println(result);

Çıktı

[Muhammet]

sorted()

Sıralama yapmamızı sağlar. Yazı ise harf sırası ( sözlük mantığı şeklinde ) sayı ise küçükten büyüğe.

List<String> name = Arrays.asList("Muhammet", "Enes", "Akçayır");
List<String> test = name.stream().sorted().collect(Collectors.toList());
System.out.println(test);

Çıktı

[Akçayır, Enes, Muhammet]

List<String> number = Arrays.asList("5", "2", "1", "3");
List<String> test = number.stream().sorted().collect(Collectors.toList());
System.out.println(test);

Çıktı

[1, 2, 3, 5]

reduce()

Yapılan işlemi teker teker basamaklarını göstererek işlemi yapar.

List<Integer> number = Arrays.asList(5, 3, 2, 8);
int newNumber = number.stream().reduce(0, (i, i1) -> {
System.out.println(i + i1);
return i + i1;
});

Burada toplama işlemi yapılmataktadır, reduce sayesinde çıktı şu şekilde olur;

İlk önce 5 sayısı gelir 5 yazılır , sonra 3 toplanır 8 yazılır, 2 toplama yapılır 10 olur, en son 8 de gelir 18 yazılır biter böylece her işlem basamağı gözükmüş olur.

Çıktı

5

8

10

18

IntStream.of(50, 20, 10, 40).reduce(1, (i, i1) -> {
System.out.println(i * i1);
return i * i1;
});

Çıktı

50
1000
10000
400000

map()

Stream içerisinde ki elemanları başka tiplere dönüştürmek veya üzerlerinde işlem yapmak için Map kullanılmaktadır.

Burada Yusuf ve Çakal adında iki String imiz var. map() ile Liste deki her Liste elemanına ekleme yaptım.

List<String> name = Arrays.asList("Yusuf", "Çakal");
name.stream().map(s -> "Map Eklentisi " + s + " Map Eklentisi").forEach(System.out::println);

Çıktı

Map Eklentisi Yusuf Map Eklentisi
Map Eklentisi Çakal Map Eklentisi

Double tipi map ile int tipine çevirdim.

DoubleStream doubleStream = DoubleStream.of(0.7, 8.2, 0.1, 6.2);
doubleStream.mapToInt(v -> (int) v).forEach(System.out::println);

Çıktı

0
8
0
6

distinct()

Listede aynı değere sahip olanları tek bir değere indirger.

List<String> names= new ArrayList<String>();
names.add("muhammet");
names.add("enes");
names.add("enes");
names.add("enes");
names.add("enes");
names.stream().distinct().forEach(System.out::println);

Çıktı

muhammet
enes

List<Integer> sayi = new ArrayList<>();
sayi.add(5);
sayi.add(7);
sayi.add(7);
sayi.add(5);
sayi.add(1);
sayi.stream().distinct().forEach(System.out::println);

Çıktı

5
7
1

count()

Toplam veri sayısını gösterir. Range ile 18 ve 25 aralığını seçip , count ile bu aralığı gösterdim.

long x = IntStream.range(18, 25).count();
System.out.println(x);

Çıktı

7

--

--