Java 8 Stream API Terminal İşlemler

0 6,978

Terminal işlemler, stream pipeline’ın sonunda kullanılan ve zincir halindeki işlemleri sonlandıran işlemlerdir. Terminal işlemler, eager’dir. Yani terminal işlem çağrıldığı anda, stream üzerindeki tüm işlemler yapılır. Terminal işlemler, bir primitive type ve ya bir koleksiyon döndürebilir ve ya hiç bir şey döndürmez.

Matching:

3 farklı match işlemi vardır. Match işlemleri Predicate tipindeki bir Functional Interface’i parametre olarak alır. Şimdi işlemleri ayrı ayrı görelim.

AllMatch:  Belirtilen koşulun stream deki tüm elemanlar tarafından sağlanması halinde true döner. Bu işlemler short-circuit işlemler’de denir. Sql deki AND gibidir. False olan bir eleman bulduğunda stream sonlandırılır.

NoneMatch: allmatch’in karşıtıdır. Stream içindeki elemanlardan ilgili koşulu hiç biri sağlamaz ise true aksi durumda false döner.

AnyMatch: Stream içindeki elemanlardan herhangi birinin ilgili koşulu sağlaması durumunda true hiç biri sağlamaz ise false döner.

Finding:
Stream içerisinde ilgili koşulu sağlayan elemanı bulur. İki metot vardır. FindAny ve findFirst. Bu metotlar geriye Optional değer dönerler. Optional<T> sınıfı, bazı metotların geri dönüş tipidir. Bunun sebebi, zincir halindeki işlemler de match veya finding işlemleri herhangi bir değer bulamaz ise geriye null döner ve bu durum zincirin devamında hataya sebebiyet verir. Bunun önüne geçebilmek için, bu metotlar Optional dönüş tipini kullanır.

FindAny: Koşulu sağlayan herhangi bir eleman var ise döner.

FindFirst: Koşulu sağlayan ilk elemanı döner. Stream sıralamayı sağlamak durumunda değilse, findAny’den bir farkı yoktur. Sıralı ise, ilk elemanı döner.

Collect: collect metotu ile stream elemanlarını başka bir koleksiyon içerisine doldurabilir, gruplama yapabilir veya toplama işlemleri yapabiliriz. collect metodu iki farklı parametre seti alarak çalışır. İlki collector tipinde bir interfacedir. Bu interface’in metotlarına Collectors sınıfının static metotları ile erişebiliriz. İkincisi ise, sırası ile Supplier, BiConsumer ve BiConsumer tipinde üç parametre bekler.

collect(Collector) Kullanımı

toList:

Personel stream içerisinden sadece MALE olanları filtreleyip, yeni bir liste olarak döndürdük.

toMap:

Personel stream içerisinden sadece MALE olanları filtreleyip, <Name,Team> çifti şeklinde bir map döndürdük.

grouping:

Personel stream içerisindeki elemanları, <Gender,List<Personel>> çifti şeklinde bir map döndürdük.

summarizingInt:

Bu metot ile int bir stream içindeki elemanların nümerik özeti yaparız. Örneğimiz de Personelin yaşlarını alarak  yeni bir stream oluşturduk ve summarizingInt ile yaş bilgisine dair özet bilgiler oluşturduk.

joining:

CharSequence alıp geriye String dönen metottur. Dönen String ifade modifiye edilmiş bir değer olabilir. Örneğimizde, önce isimlerden oluşan bir stream oluşturup sonra bu isimleri “,” ile birbirine bağlayıp geriye String bir ifade döneceğiz.

reducing:
Stream içerisindeki elemanları teker teker işleyerek geriye toplam, min, max vb tek değerlerin dönmesini sağlayan metottur.

Reduce metotu sıradaki eleman ile bir önceki elemanı beraber işler. Identity başlangıç değerini verir. Identity olmayan reduce metotları geriye Optional objesi döner.

reduce(T identity, BinaryOperator accumulator)

reduce(BinaryOperator accumulator)

Örneğimizde dönüş tipi Optional<Integer> olduğunda, ifPresent ile var olup olmadığına baktık ve sonra yazdırdık.

reduce(U identity,BiFunction<U, ? super T, U> accumulator, BinaryOperator combiner)

Personellerimiz arasındaki en genç personeli bulalım.

Örnek Kodlar: Java8StreamAPI

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

İyi Çalışmalar

Email adresiniz yayınlanmayacaktır.