Java 8 Stream API Intermediate İşlemleri

0 2,905

Intermediate işlemler geriye yeni bir stream dönen işlemlerdir. Intermediate operasyonlar ile stream üzerinde zincir işlemler yapabiliriz. Buna stream pipeline denilir. Pipeline içindeki her bir intermediate işlem, bir initial stream ile başlar ve kendinden sonrakine yeni bir stream döner. Bu işlemler, lazy’dir. Terminal işlemi çağrılana kadar, herhangi bir intermediate işlem çalışmaz.

Kodun çıktısını inceleyelim.  1 ve 2 elemanlarından oluşan bir listemiz var. Bu listeden bir stream olusturuyoruz ve stream üzerinde map ve filter intermediate işlemleri yapıyoruz. Ama stream.forEach çağrılana kadar stream üzerinde herhangi bir işlem yapılmadı.

Intermediate işlemler stateless ve stateful olarak ikiye ayrılırlar. Filter stateless bir işlemdir. Her bir eleman bir öncekinden ve sonrakinden ayrı değerlendirilir. Stateful metotlarda ise, ilgili işlem başlamadan önce, önceki işlemin tamamlanması gerekmektedir. Sorted, distinct bu tarz işlemlerdendir. Bir önceki işlem sonucu oluşacak tüm sonuçlar bilinmeli ki stateful işlemler yapılabilsin. Bu gereksinim, stateful işlemlerin buffer’lı çalışmasına sebep olur. Buffer büyük verilerde memory problemine sebebiyet verebilir. Dikkatli kullanılması gereken işlemlerdir.

Şimdi Java Stream API içeresindeki intermediate operasyonlar ve kullanım amaçlarını inceleyelim.

Map: Stream içerisindeki elemanların formunu değiştiren operasyondur. Elemanın bir özelliğini ve stream içindeki elemanın tipini değiştirebiliriz. Bir örnek üzerinden bakalım.

Personel listesinin içerisinden, her bir personelin cinsiyetini almak istediğimiz de;

Çıktı:

Map metodu ile stream içerisindeki Personel örneklerinin içerisinden gender bilgilerini aldık ve oluşan yeni stream’i collect metodu ile başka bir listeye çevirdik. Personel listesinden Stream<Personel> oluşturduk, map işlemi sonrası oluşan stream ise Stream<Gender> oldu. İkinci örneğimizde ise, personel isimlerini büyük harf ile güncelledik ve oluşan stream, Stream<String> oldu.

map metotu Function<R,V> tipinde bir functional interface alır. R input tipi, V output tipidir.

map(personel -> personel.getAddress()) personel input, address ise outputtur.

Not: Terminal işlemi ile sonlandırılan bir stream, tekrardan kullanılamaz. Eğer kullanmaya çalışır isek aşağıdaki hatayı alırız.

MapToInt, MapToLong, MapToDouble:

Nümerik terminal işlemlerinin bazıları belli bir stream tipi ister. Örneğin min, max gibi metotlar, Object tipinde bir stream değil Integer veya Double tipinde stream isterler. Bu metotları kullanacağımız zaman, MapToInt ve diğer metotları kullanırız.

Çıktı:

FlatMap: Map bir tip donerken, flatMap stream döner. Eğer elimizde işleyecek olduğumuz liste içerisinde integer listesi var ise, iç listelerin önce stream olarak alınması ve sonrasında işlenmesi gerekir. Bu işlemi map ile yapamayız.

Aşağıdaki örnekte çift sayıları bulucağız.

Çıktı:

Örneğimizde, flatMap içerisine parametre olarak liste gönderildi ve bunu stream’e çevirdik. Filtre ile de oluşan stream içerisindeki çift sayıyı bulmaya çalıştık.

Filter: Boolean bir değer dönen Predicate interface’ini parametre olarak alır, ilgili koşulu true olan elemanlardan oluşan bir stream döner.

Çıktı:

Distinct: Stream’in içindeki elemanları tekil hale çevirir. Tekrar eden elemanlar elenir. Tekrar eden elemanlar, nesnenin equals metotu kullanılarak bulunur.

Çıktı:

Skip: long tipinde parametre alarak, verilen parametre kadar elemanı atlar. Verilen değer stream’in eleman sayısından büyük veya eşit ise, geriye dönen stream boş bir streamdir. Atılan elemanlar baştaki elemanlardır. Bu durumda stream’in ordered ve unordered olma durumu önem kazanır. Stream ordered ve paralel işleniyorsa, bu metot kötü performans gösterir. Memory problemine yol açabilir. Eğer metot kullanılacak ve ordered olması önemli değilse, stream unordered yapılmalıdır.

Çıktı:

Limit: long tipinde parametre alarak, sadece verilen parametre kadar elemanı alır.

Çıktı:

Sort: sorted() metotu varsayılan sıralamaya göre sıralama yapar. Integerler 0 dan itibaren veya string ifadeler alfabetik olarak. sorted(Comparator<? super Personel> comparator) bir instance’in herhangi bir özelliğini verebilir ve ona göre sıralama yapabiliriz.

Çıktı:

Örnek Kodlar: Java8StreamAPI

İnşallah faydalı bir yazı olmuştur.

İyi Çalışmalar

Email adresiniz yayınlanmayacaktır.