Intermediate əməliyyatlar verilənləri çevirmək və yeni axın yaratmaq üçün istifadə olunur. Məlumat axını üzərində daha mürəkkəb əməliyyatları yerinə yetirmək üçün onları bir-birinə zəncirləmək olar. Intermediate əməliyyatlara misal olaraq filter() , map() , flatMap(), distinct() və sorted() daxildir . Bu əməliyyatlar sonrakı emal üçün istifadə oluna bilən yeni axını qaytarır.
Terminal əməliyyatları, əksinə, son nəticə və ya yan təsir yaratmaq üçün istifadə olunur, həmçinin intermediate əməliyyatların icrasını işə salar. Terminal əməliyyatlarına misal olaraq forEach(), toArray(), reduce(), collect(), anyMatch(), allMatch(), noneMatch(), findFirst(), findAny(), count(), min(), max (), forEachOrdered() və toCollection(). Bu əməliyyatlar axını istehlak edir və son nəticəni qaytarır və ya axının elementlərini konsola çap etmək kimi yan təsir yaradır.
Qeyd etmək vacibdir ki, terminal əməliyyatları axınların istehlak edildiyi nöqtədir, bundan sonra axın artıq istifadə edilə bilməz, ona görə də sonrakı əməliyyatları yerinə yetirmək üçün yeni axın yaratmalısınız.
Intermediate əməliyyatlar məlumatı çevirən, lakin yekun nəticə verməyən stream (axın) əməliyyatlardır. Məsələn, verilənlər axınında aralıq əməliyyat yalnız müəyyən elementləri daxil etmək üçün stream (axının) süzgəcdən keçirə bilər və ya elementləri yeni dəyərlərə uyğunlaşdıra bilər. Java-da Stream API-də intermediate əməliyyata misal olaraq Predikatı qəbul edən və yalnız predikatı təmin edən elementləri ehtiva edən yeni axını qaytaran filter() metodudur.
Terminal əməliyyatları isə son nəticə və ya yan təsir yaradan əməliyyatlardır. Onlar stream (axının) sonunu qeyd edir və intermediate əməliyyatların icrasına təkan verir. Java-da Stream API-də terminal əməliyyatına misal olaraq İstehlakçı götürən və onu stream (axının) hər bir elementə tətbiq edən forEach() metodudur.
Aralıq əməliyyatlar son nəticə vermədən məlumat stream (axını) çevirən əməliyyatlardır . Onlar stream (axın)-dakı verilənlər üzərində süzgəcdən keçirmək, xəritələşdirmək və ya digər əməliyyat növlərini yerinə yetirmək üçün istifadə oluna bilər və sonrakı emal üçün istifadə oluna bilən yeni stream (axını) qaytarır. Intermediate əməliyyatların bəzi ümumi nümunələri bunlardır:
- filter() : Bu əməliyyat Predikatı götürür və yalnız predikatı təmin edən elementləri ehtiva edən yeni stream (axını) qaytarır.
- map() : Bu əməliyyat Funksiya götürür və onu stream (axın)-dakı hər bir elementə tətbiq edir, dəyişdirilmiş elementlərlə yeni stream (axını) qaytarır.
- flatMap() : Bu əməliyyat Funksiya götürür və onu stream (axın)- dakı hər bir elementə tətbiq edir, nəticədə cərəyanların birləşdirilmiş elementləri ilə yeni stream (axını) qaytarır.
- distinct() : Bu əməliyyat onların təbii sırasına və ya təqdim edilmiş müqayisəçiyə əsaslanan fərqli elementləri olan yeni stream (axını) qaytarır.
- sorted() : Bu əməliyyat təbii sıraya və ya təqdim edilmiş müqayisəçiyə görə çeşidlənmiş yeni stream qaytarır.
Məlumat stream üzərində daha mürəkkəb əməliyyatları yerinə yetirmək üçün bu əməliyyatlar zəncirlə birləşdirilə bilər. Məsələn, müəyyən elementləri seçmək üçün filter() funksiyasından istifadə edə, sonra həmin elementləri çevirmək üçün map() funksiyasından istifadə edə və nəticədə yaranan stream istehlak etmək üçün forEach() funksiyasından istifadə edə bilərsiniz.
Java-da Stream API-də bəzi ümumi intermediate əməliyyatların siyahısı və onlardan istifadə nümunələri:
- filter() : Bu əməliyyat Predikatı götürür və yalnız predikatı təmin edən elementləri ehtiva edən yeni stream qaytarır. Məsələn, siz tam ədədlər stream (axının)-dan yalnız cüt ədədləri seçmək üçün filter() funksiyasından istifadə edə bilərsiniz:
Stream<Integer> evenNumbers = numbers.filter(n -> n % 2 == 0);
- map() : Bu əməliyyat Funksiya götürür və onu stream (axın)-dakı hər bir elementə tətbiq edir, dəyişdirilmiş elementlərlə yeni stream qaytarır. Məsələn, sətir stream-ni onların uzunluqlu stream-nə çevirmək üçün map() funksiyasından istifadə edə bilərsiniz:
Stream<Integer> stringLengths = strings.map(String::length);
- flatMap() : Bu əməliyyat Funksiya götürür və onu stream-dəki hər bir elementə tətbiq edir, nəticədə cərəyanların birləşdirilmiş elementləri ilə yeni stream qaytarır. Məsələn, tam ədədlər siyahısı stream-ni düzləşdirmək üçün flatMap() funksiyasından istifadə edə bilərsiniz:
Stream<Integer> flattened = lists.flatMap(List::stream);
- distinct() : Bu əməliyyat onların təbii sırasına və ya təqdim edilmiş müqayisəçiyə əsaslanan fərqli elementləri olan yeni stream qaytarır. Məsələn, tam ədədlər stream-dən dublikat elementləri silmək üçün distinct() istifadə edə bilərsiniz:
Stream<Integer> distinct = integers.distinct();
- sorted() : Bu əməliyyat təbii sıraya və ya təqdim edilmiş müqayisəçiyə görə çeşidlənmiş yeni stream qaytarır. Məsələn, sətir stream-ni əlifba sırası ilə çeşidləmək üçün sorted() funksiyasından istifadə edə bilərsiniz:
Stream<String> sorted = strings.sorted();
- peek() : Bu əməliyyat girişlə eyni elementləri olan yeni stream qaytaracaq, lakin hər bir element üçün təmin edilmiş istehlakçı tətbiq edəcək. Bu əməliyyat sazlama və monitorinq məqsədləri üçün faydalıdır, stream-i heç bir şəkildə dəyişməyəcək. Məsələn, tam ədədlər stream-nin hər bir elementini çap etmək üçün peek() funksiyasından istifadə edə bilərsiniz:
Stream<Integer> peek = integers.peek(System.out::println);
- limit() : Bu əməliyyat giriş stream-dən verilən maksimum element sayından çox olmayan yeni stream qaytaracaq. Məsələn, tam ədədlər stream-nin ilk beş elementini əldə etmək üçün limit() funksiyasından istifadə edə bilərsiniz:
Stream<Integer> limit = integers.limit(5);
- skip() : Bu əməliyyat ilk təmin edilmiş element sayından başqa giriş stream-nin bütün elementlərini ehtiva edən yeni stream qaytaracaq. Məsələn, tam ədədlər stream-nin ilk 10 elementini silmək üçün skip() funksiyasından istifadə edə bilərsiniz:
Stream<Integer> skip = integers.skip(10);
Bunlar Java-da Stream API-də mövcud olan intermediate əməliyyatların bir neçə nümunəsidir , asOf, takeWhile, dropWhile, concat və s . kimi daha çox əməliyyatlar var. Məlumat stream-də daha mürəkkəb əməliyyatları yerinə yetirmək üçün bir neçə intermediate əməliyyatı birləşdirə bilərsiniz.
Java-da Stream API-də bəzi ümumi terminal əməliyyatlarının siyahısı və onlardan istifadə nümunələri:
- forEach() : Bu əməliyyat İstehlakçı götürür və onu stream-dəki hər bir elementə tətbiq edir. Məsələn, sətir stream-nin hər bir elementini çap etmək üçün forEach() funksiyasından istifadə edə bilərsiniz:
simlər. forEach ( Sistem . out ::println);
- toArray(): Bu əməliyyat axının elementlərini ehtiva edən massivi qaytarır. Məsələn, sətirlər axınını sətirlər massivinə çevirmək üçün toArray() funksiyasından istifadə edə bilərsiniz:
String[] stringArray = strings.toArray(String[]::new);
- reduce(): Bu əməliyyat akkumulyator funksiyası və əlavə identifikasiya dəyərini götürür və onu tək bir dəyərə endirmək üçün axının elementlərinə tətbiq edir. Məsələn, tam ədədlər axınının cəmini tapmaq üçün reduce() istifadə edə bilərsiniz:
int sum = integers.reduce(0, Integer::sum);
- collect() : Bu əməliyyat Kollektor götürür və onu List, Set və ya Map kimi vahid dəyərə endirmək üçün axının elementlərinə tətbiq edir. Məsələn, sətirlər axınını uzunluğuna görə qruplaşdırmaq üçün collect() funksiyasından istifadə edə bilərsiniz:
Map<Integer, List<String>> groupedByLength = strings.collect(Collectors.groupingBy(String::length));
- anyMatch() : Bu əməliyyat axının hər hansı elementi verilmiş predikata uyğun gələrsə, true qaytarır, əks halda isə false qaytarır. Məsələn, sətir axınındakı hər hansı elementin “a” hərfi ilə başladığını yoxlamaq üçün anyMatch() funksiyasından istifadə edə bilərsiniz:
boolean anyStartsWithA = strings.anyMatch(s -> s.startsWith( "a" ));
- allMatch() : Əgər axının bütün elementləri verilmiş predikata uyğun gələrsə, bu əməliyyat true qaytarır, əks halda isə false qaytarır. Məsələn, tam ədədlər axınındakı bütün elementlərin müsbət olub olmadığını yoxlamaq üçün allMatch() funksiyasından istifadə edə bilərsiniz:
boolean allPositive = integers.allMatch(i -> i > 0 );
- noneMatch() : Əgər axının heç bir elementi verilmiş predikata uyğun gəlmirsə, bu əməliyyat true qaytarır, əks halda isə false qaytarır. Məsələn, sətirlər axınındakı elementlərin heç birinin boş olmadığını yoxlamaq üçün noneMatch() funksiyasından istifadə edə bilərsiniz:
boolean noneEmpty = strings. noneMatch ( String :: isEmpty );
- findFirst() : Bu əməliyyat bu axının ilk elementini təsvir edən Optional (könüllü) və ya axın boşdursa, boş Optional qaytarır. Məsələn, tam ədədlər axınının ilk elementini əldə etmək üçün findFirst() funksiyasından istifadə edə bilərsiniz:
Optional<Integer> first = integers.findFirst();
- findAny() : Bu əməliyyat axının bəzi elementlərini təsvir edən Optional (könüllü) qaytarır və ya axın boşdursa, boş Optional qaytarır. Məsələn, tam ədədlər axınının istənilən elementini əldə etmək üçün findAny() funksiyasından istifadə edə bilərsiniz:
Optional<Integer> any = integers.findAny();
- count() : Bu əməliyyat axındakı elementlərin sayını qaytarır. Məsələn, tam ədədlər axınındakı elementlərin sayını əldə etmək üçün count() funksiyasından istifadə edə bilərsiniz:
long count = integers.count();
- min, max : Bu əməliyyat axının minimum və ya maksimum elementini onların təbii sırasına və ya təqdim edilmiş müqayisəçiyə uyğun olaraq qaytarır. O, minimum/maksimum elementdən ibarət Optional (könüllü) və ya axın boşdursa, boş Optional qaytarır. Məsələn,tam ədədlər axınının ən kiçik elementini əldə etmək üçün min() funksiyasından istifadə edə bilərsiniz:
Optional<Integer> min = integers.min(Integer::compareTo);
və ya max() tam ədədlər axınının ən böyük elementini əldə etmək üçün:
Optional<Integer> max = integers.max(Integer::compareTo);
- forEachOrdered() : Bu əməliyyat forEach() əməliyyatına bənzəyir, lakin o, elementlərin axın paralelləşdirildikdə belə, axında göründükləri ardıcıllıqla işlənəcəyinə zəmanət verir.
- toCollection() : Bu əməliyyat axının elementlərini təqdim edilmiş kolleksiyaya toplayır. Məsələn, siz tam ədədlər axınını Siyahıya çevirmək üçün toCollection() funksiyasından istifadə edə bilərsiniz:
List < Integer > intList = integers.toCollection(ArrayList:: new );
Bunlar Java-da Stream API-də mövcud olan terminal əməliyyatlarının yalnız bir neçə nümunəsidir. Onlar intermediate əməliyyatların icrasına təkan verəcək və son nəticə və ya yan təsir yaradacaqlar.
Xülasə olaraq, intermediate əməliyyatlar verilənləri çevirmək və yeni axın yaratmaq üçün istifadə olunur, terminal əməliyyatları isə son nəticə və ya yan təsir yaratmaq üçün istifadə olunur, həmçinin intermediate əməliyyatların icrasını işə salar.