CodeGym /Kurslar /Java SELF AZ /Collectorlər Java-da

Collectorlər Java-da

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

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:

toList()
Stream-i siyahıya çevirən obyekt — List<T>
toSet()
Stream-i çoxluğa çevirən obyekt — Set<T>
toMap()
Stream-i map-ə çevirən obyekt — Map<K, V>
joining()
Stream elementlərini bir sətirdə birləşdirir
mapping()
Stream elementlərini Map<K, V>-ə çevirir
groupingBy()
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(", ") );

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION