Java-da Kollektorlar

All lectures for AZ purposes
Səviyyə , Dərs
Mövcuddur

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:

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

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