1. Elementlərin yığılması
Nəhayət, biz Stream sinifindəki ən maraqlı metoda gəlib çıxdıq - collect() metoduna. Bu metod axınlardan adi kolleksiyalara keçmək üçün istifadə olunur - List<T>, Set<T>, Map<T, R> və digərləri.
collect() metodu üçün xüsusi bir obyekt - collector ötürmək lazımdır. Bu obyekt axından bütün məlumatları oxuyur, onları müəyyən bir kolleksiyaya çevirir və onu qaytarır. Həmçinin bu kolleksiyanı elə collect metodu özü də qaytarır.
Bütün bunlar olduqca ağıllı bir şəkildə həyata keçirilmişdir: collector obyekti Collector<T, A, R> tipinə malikdir – üç tip-parametri var. Sonuncu tip R, adətən, List<T> tipinə bənzəyir. Buna görə də kompilyator bu tip vasitəsilə collect() metodunun düzgün nəticə tipini müəyyən edə bilər.
Ümid edirəm ki, çox qarışmadınız. Hər hansı halda, Collector tipli obyektləri özünüz yaratmağa ehtiyac yoxdur. Sadəcə Collectors sinifinin statik metodları vasitəsilə qaytarılan hazır obyektləri istifadə etmək kifayətdir.
Collectors Sinfi
Collectors sinifində hər vəziyyət üçün hazır kollektor obyektləri qaytaran bir neçə statik metod var. Onlar bir neçə onlarla, amma biz ən əsaslarını nəzərdən keçirəcəyik:
|
Axını siyahıya çevirən obyekt — List<T> |
|
Axını çoxluğa çevirən obyekt — Set<T> |
|
Axını xəritəyə çevirən obyekt — Map<K, V> |
|
Axın elementlərini bir sətirə birləşdirir |
|
Axın elementlərini Map<K, V> formasına çevirir |
|
Elementləri qruplaşdırır, Map <K, V> qaytarır |
2. Axını siyahıya çevirilməsi
Axınla tipik iş və onun nəticəsini siyahıya çevirilməsi belə görünür
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salam", "necə", "san?");
List<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toList() );
Kolleksiyadan axını əldə etdik, sonra isə yalnız ilk simvolu böyük hərf olan sətirləri filtr edərək yeni bir axın əldə etdik. Sonra son axından bütün məlumatları toplayaraq koleksiyon qaytardıq.
3. Axını çoxluğa çevrilməsi
Axın ilə işləmək və onun nəticəsini müntəzəmə çevirmək belə görünür
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salam", "necə", "san?");
Set<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toSet() );
Axını List
-ə çevirmə koduna çox bənzəyir, yalnız başqa bir kollektor obyektindən istifadə olunur, hansı ki, toSet();
metodu qaytarır
4. Axını map-ə çevrilməsi
Axını map-ə çevirmək bir az daha çətindir. Çünki hər Map obyekti iki elementdən ibarətdir - açar və dəyər. Axın elementinin açarını necə müəyyən edəcəyimizi, dəyərini isə necə müəyyən edəcəyimizi düşünməliyik.
Məsələn.
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
Map<String, String> result = list.stream()
.map( e -> e.split("=") )
.filter( e -> e.length == 2 )
.collect( Collectors.toMap(e -> e[0], e -> e[1]) );
Burada nə baş verdiyini izah edək.
Birinci sətirdə map(...)
metodu ilə hər bir sətiri sətirlər massivinə çeviririk. Split metodu vasitəsilə hər bir sətiri bərabər simvolu ilə iki hissəyə ayırırıq.
İkinci sətirdə — filter()
metodunda — yalnız iki elementli massivləri saxlayırıq. d == 3
elementi üç elementdən ibarət massiva çevrildi və filtirdən keçməyəcək.
Və nəhayət, son sətirdə axını Map<String, String>
-ə çeviririk. toMap()
metodunda iki funksiya verilir. Axın elementinin hər biri üçün birinci funksiya açarı qaytarmalı, ikinci isə - dəyəri qaytarmalıdır.
Bizdə açar kimi massivlərin ilk elementi olacaq ("a", "b", "c"), dəyərlər isə massivlərin ikinci elementi olacaq: "2", "3", "4".
5. Axını sətirə çevirilməsi
Digər maraqlı kollektor obyektləri Collectors.joining()
vasitəsilə axının bütün elementlərini String
tipinə çevirir və onları bir sətir halına gətirir. Məsələn
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
String result = list.stream().collect( Collectors.joining(", ") );
GO TO FULL VERSION