Java Stream API





Java 8-den etibaren bizler ucun arrayler, collection api tipleri ve.s rahat isleye bilmemiz ucun stream api ile gelmisdir.
Stream interface-si java.util.Stream altinda yerlesir.
Collection tipinden olan obyektlere .stream() ve ya .parallelStream() deyerek stream ala bilerik.
Bize ne qeder rahatliq ve kod oxunaqligi qatdigini asagidaki kodlardan gore bielrsiz :


Eger get etsek asagida xeta bas verecek tapmasa :








Bu kimi hallarin qarsini almaq ucun ise elave olaraq ifPresent kimi sertlerden istfde edilir :




Yuxaridaki examplda uzun sekilde Sytem,out,println(min) yazmaq evezine LAMBDA ile de bunu ede bilerik :


Umumi flow 3 merhele ile gedir , evvelce stream yaradiriq , daha sonra uzerinde prosess edirik ve en sonda consume edirik neticede aldigimiz streami.
Yeni stream-ler bir pipeline mentiqi ile isleyir.




Stream Api bize verdiyi bezi istifadeye yararli funksiyalara ve istifade yollarina baxaq :


Sql ile isleyen alismis insanlar ucun sintax tanis gelecek ve daha rahat olar :

En cox maas alan 3 iscinin adini tapib ekrana verek :







Filter ->


Foreach ->




Ve ya hal hazirda da aktiv olan en cox maas alan iscilerin siyahisini bir liste yigaq :


Gorduyunuz kimi stream-i liste cevirmek ucun collect metodundan ve  Collectors.toList -den istfde edirik. Collectors daxilinde
group by, joining kimi basqa elverisli imkanlar da vardir. 
Ve ya Collectprs.toSet toMap toCollection ve.s de deye bielrsiz:


map() istifadesi -> 
stream daxilindeki data uzerinde deyisiklikler etmeye komek edir funskiya tipinden alir parametr.
Burada biz cast-lar ede bilerik, data uzerinde emeliyyat apara bilerik ve.s istediyiniz emeliyyati etmeye imkan verir.
Map funksiyasi intermadiate operation-dir. 


Umumiyyetle stream api-da 2 cur operationlar var :
  1. Intermediate -> geriye yene de stream tipi qaytarir.Bir stream-den digrine transform edir.
  1. Terminal -> geriye non stream tip qaytarir ve ya umumiyyetle return etmir hec ne . Ve calisdiqdan sonra stream -i tekrar use ede bilmirsiz.

He gelin yeniden map-e qayidaq ve bezi istifadelerine baxaq :


reduce istifadesi -> 
Stream-de ardicil gelen elementler uzerinde islemeye komeklik edir. Bir evvelde alinan netice bir sonraki step-e oturulur ve netice optionaldir.
Ipnut olaraq ise BinaryOperator alir.









Map ve Reduce cox vaxt bir yerde istifade edilir, Umumiyyetle map reducing anlayisi big data-da ve.s de cox istifade olunan yanasmadir.
Stream api ile map reduce beraber istifadesine baxaq.
Meselem siyahidan ortalama yasi tapmaq istenirse asagidaki kimi istfde edile biler:



Paralel Stream 
Gelin izah etmek ucun bele bir ssennari deyek bir person siyahimiz var 1000 personluq ve her person detail melumatlari hanisa api servis uzerinden gelir.
Bu zaman biz foreach icerisinde servis cagiririq ve her defe servis cavab verenden sonra diger persona kecid edilir.Bu ise bize hem vaxt itkisidir hem de CPU -nu
mehsuldar istfde etmis olmuruq. Bunun ucun paralelStream() var :



findAny ve findFIrst
Bu funskiyalar stream empty olmadigi halda geriye onun elementini qaytarir.Stream bos oldugu halda ise optional empty qaytarir.
Stream-i full reduce etmeden de netice vere bilerler adlarindan gorunduyu kimi. FindAny adeten paralel emelyyatlar zamani useful olur.
Eks halda qaranti olunmasa da ele 1-ci uygun gelen elementi qaytarir findFirst kimi.

anyMatch , allMatch ve noneMatch
Eslinde adlarindan melumadur. Input olaraq predicate type alirlar ve uygun olaraq any serte her hansi biri uygun gelirmi,
all butun stream serte uyurmu ve none hec biri uymurmu onun melumatini qaytarir.


flatMap() 
flatmap de map-le eyni isi gorur amma bununla biz bir nece colelction birlesirib bir stream kimi islemek isteyirikse lazim olur.
Eslinde combine edir ve bize bir stream verir :




peek()


Peek-le foreach demek olar eyni isi gorur amma burada esas ferq peek-in intermediate operation olmasidir. Yeni biz peek istifade etdikde yeniden stream uzerinde isleye bilerik.
Consumer  tipinden alir parametr olaraq ve adeten debug ucun istfde etmek olur :


Gorduyunuz kimi forecah-den ferqli olaraq biz peek-den sonra  map ve.s istfde ede bildik peek-i bir debug ucun istfde etdik eslinde.


Ve eslinde biz stream elementi mutable deyilse peek ile deyisiklik de ede bilerik :


peek() java 9-dan yuxari versiyalarda istediyiniz kimi islemeye biler ve ekrana deyer vermeye biler adeten .count() sona terminal operation elave etsez de.
Run olmasi ucun evvelde nese filter verib sonra sonuna count elave edin.



Stream-ler yalniz bir defe consume oluna biler bir stream-i ikinci defe consume etdikde xeta verir :

Maraqli bir example baxaq :
Hemise diqqet edin ki sorted()  butun data ona qayidandan sonra isleyir. Burada ise generate isttfde edilir ve her defe Elsa generate olunur
ve filtere de duzgun gelir ona gore sonsuz loop yaranir. Eger biz limit elave etsek sorted-den evvel bu zaman artiq normal isleyecek cunki limit-e gelende artiq generate stop olumus olur.
Bu kimi infinity loop yarana hallarda xususen diqqet etmek lazimdir ki paralel() istifade etmeyesiz! Cunki bu zmaan CPU
sisecek ve hard reboot etmeli ola bielrsiz serverinize normala qayitmaq ucun.

Diger bir maraqli meqama baxaq. Limit() istifadesinde asagidaki kimi bir example-da :
Burada  limit ve distinc sirasi sehvdir ! Neye gore ? Cunki burada  iterate 0 ve 1 yaradir daha sonra limit(10) dedikde bizim ucun
10 dene  0 1 0 1 0 1 0 1 0 1 verir ve daha sonra yeniden distinc edilib 0 ve 1 alinir. Halbuki evvelden distinct verilmeli idi daha sonra limit verdikde bize artirib vermeyecekdi stream-i.


















Takewhile
Filter ile oxsar olsalar da eslinde ferqlidirler. Adindan da melum oldugu kimi takeWhile sert odenildiyi muddetce isleyir stream-in diger itemlerine baxmir serrt qirildiqda :





Empty stream yaratmaq ucun :


Array-den stream yaratmaq yollari:


Text file-dan stream almaq :



Multiple filter vs single complex filter 

Muqayisede single filter daha suretli yerine yetirilecek

Yorumlar

Bu blogdaki popüler yayınlar

INGILIS DILI BUTUN ZAMANLAR

İNGİLİS DİLİNDƏ ƏN ÇOX İSTİFADƏ OLUNAN 2600 CÜMLƏ QƏLİBLƏRİ VƏ 6000 SÖZ