1. Elementlərin toplanması
Və nəhayət gəlib çatdıq Stream
sinfindəki ən maraqlı metoda — collect()
metoduna. Bu metoddan istifadə edərək stream-lərdən adi kolleksiyalara — List<T>
, Set<T>
, Map<T, R>
və digər kolleksiyalara keçid edə bilərik.
collect()
metoduna xüsusi bir obyekt ötürmək lazımdır — collector
. Bu obyekt stream-dən bütün məlumatları oxuyur, onları müəyyən kolleksiyaya çevirir və həmin kolleksiyanı geri qaytarır. Həmçinin, bu kolleksiyanı geri qaytaran collect()
metodunun özüdür.
Bütün bu proseslər olduqca ağıllıca qurulmuşdur: collector
obyektinin tipi Collector<T, A, R>
şəklindədir – onda üç tip parametri var. Sonuncu tip R
— adətən List<T>
kimi bir tip olur. Buna görə kompilyator bu tipə əsasən collect()
metodunun düzgün nəticə tipini təyin edə bilər.
Ümid edirəm, çox qarışıq olmadı. Hər halda, Collector tipində obyektləri özünüz yaratmaq ehtiyacınız yoxdur. Sadəcə Collectors
sinfinin statik metodları tərəfindən qaytarılan hazır obyektlərdən istifadə edə bilərsiniz.
Collectors Sinfi
Collectors
sinfində hər vəziyyət üçün hazır collector obyektləri qaytaran bir neçə statik metod var. Onların bir neçəsi var, amma biz əsas olanlarını nəzərdən keçirəcəyik:
|
Stream-i siyahıya çevirən obyekt — List<T> |
|
Stream-i çoxluğa çevirən obyekt — Set<T> |
|
Stream-i map-ə çevirən obyekt — Map<K, V> |
|
Stream elementlərini bir sətirdə birləşdirir |
|
Stream elementlərini Map<K, V> -ə çevirir |
|
Elementləri qruplaşdırır, Map<K, V> qaytarır |
2. Axını siyahıya çevirmək
Aşağıda axın ilə tipik iş və nəticəni siyahıya çevirmək göstərilib
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salam", "necəsən", "nə var?");
List<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toList() );
Kolleksiyadan axın aldıq, sonra bu axından yalnız ilk simvolu böyük olan sətirləri süzgəcdən keçirən yeni bir axın yaratdıq. Daha sonra sonuncu axındakı bütün məlumatları toplayıb bir kolleksiyaya dönüştürdük və qaytardıq.
3. Axını çoxluğa çevirmək
Axın ilə işləmək və nəticəni çoxluğa çevirmək üçün tipik kod belə görünür
ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Salam", "necəsən", "işlər?");
Set<String> result = list.stream()
.filter( s -> Character.isUpperCase(s.charAt(0)) )
.collect( Collectors.toSet() );
Hamısı axını List
-ə çevirmək koduna çox oxşayır, lakin burada başqa bir obyekt-kollektor istifadə olunur, hansı ki, metodun qaytardığı toSet();
obyektidir.
4. Stream-i Map-ə çevirmək
Amma Stream-i Map-ə çevirmək bir az çətindir. Axı hər Map obyekti iki elementdən ibarətdir — açar və dəyər. Biz qərar verməliyik ki, Stream elementindən açarı necə götürək və dəyəri necə təyin edək.
Nümunə.
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]) );
Gəlin görək burada nə baş verir.
Birinci sətirdə map(...)
metodu ilə hər bir sətiri string massivinə çeviririk. split metodundan istifadə edərək, hər bir sətri “bərabərdir” simvolu ilə iki hissəyə ayırırıq.
İkinci sətirdə — filter()
metodunda, yalnız iki elementdən ibarət array-ları filtr vasitəsilə keçiririk. d==3
elementi üç elementdən ibarət bir array-ə çevriləcək və filtrdən keçməyəcək.
Və nəhayət, sonuncu sətirdə Stream-i Map<String, String>
-ə çeviririk. toMap()
metoduna iki funksiya ötürülür. Stream-dəki hər bir element üçün birinci funksiya açarı qaytarmalıdır, ikinci isə dəyəri qaytarmalıdır.
Bizim halda, array-in birinci elementi ("a", "b", "c") açar olacaq, ikinci elementi isə dəyər olacaq: "2", "3", "4".
5. Stream-i sətirə çevirmək
Başqa bir maraqlı obyekt-kollektor — bu Collectors.joining()
metodudur. O, stream-in bütün elementlərini String
tipinə çevirib bir sətirdə birləşdirir. Nümunə:
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