Dart Takrorlanuvchilar (Iterables)

Iterables sinfi boshqa turlar uchun, xususan, ro’yxat (List) va to’plam (Set) turlariga tayanch tur bo’lib, bular iterable sinfidan voris olib yaratilgan. Hamda bir qator umumiy funksiyalarni taqdim etadi va shu tur orqali to’plam, ro’yxat obyektlarini yaratishimiz mumkin.

Iterables turini to’liq tushunish uchun siz Linked List ma’lumotlar tuzilmasi bilan birmuncha tanish bo’lishingiz tavsiya etiladi. Iterables obyekti quyidagi usullarda yaratiladi:

Iterable<int> list = [1, 2, 3, 4];
Iterable<int> set = {1, 2, 3, 4};

Va koddagi list va set nomli o’zgaruvchilar turini tekshirganimizda biz Iterables deb nomlangan holatda chiqqani ko’rmaymiz, umuman.

void main() {
Iterable<int> list = [1, 2, 3, 4];
Iterable<int> set = {1, 2, 3, 4};
print(list.runtimeType);
print(set.runtimeType);
}
>> List<int> >> _Set<int>

Natija List va Set turlarini ko’rsatmoqda. Chunki, ulardagi qiymatlar mana shu turlarga mos tartibda berilgani bois va bu tur faqat asos bo’lgani uchun uning farzandlari keyingi o’ziga mos jarayonni boshqaradi.

Iterable turi boshqa turlarga taqdim etuvchi funksiyalarni ko’rib chiqamiz:

where() – funksiyasi shartga qarab elementlarni tanlash imkonini beradi va filtrlash vazifasini bajaradi. Funksiyasida ko’rishimiz mumkinki, bool turida qiymat qaytaruvchi funksiya yozish kerak. Natijani esa doimo bir o’zgaruvchiga saqlab olish kerak.

Iterable<int> where(bool Function(int) test)

void main() {
Iterable<int> list = [1, 2, 3, 4];
var juft_sonlar = list.where((element) => element % 2 == 0);
print(juft_sonlar);
}
>> (2, 4)

Yuqoridagi kodda juft_sonlar deb nomlangan o’zgaruvchiga list nomli Iterable obyektdan juft qiymatli elementlarni ajratib olmoqdamiz.

map() – funksiyasi to’plam ma’lumotlarini o’zgartirishga imkon beradi.

Iterable<T> map<T>(T Function(int) toElement)

Bu funksiya T Function(int) toElement funksiyasini parametr sifatida oladi. Bu parametr qilib olingan funksiya to’plamning har bir elementini o’ziga paramatr sifatda uzatadi va yangilangan qiymatni qaytaradi.

void main() {
Iterable<int> list = [1, 2, 3, 4];
var kvadrat_sonlar = list.map((e)=>e*e);
print(kvadrat_sonlar);
}
>> [1, 4, 9, 16]

Bu yerda (e)=>e*e anonim funksiya map funksiyasiga o’tkaziladi, e to’plam elementini ifodalaydi va sonning kvadratini hisoblab qaytaradi. Hamda bu funksiya Lug’at (Map) turi ham mavjud bo’lib, unda key va value parametr sifatida yuboriladi.

reduce() – to’plam elementlarini to’plashga yordam beradi. Biz to’plam elementlarini mana bu tarzda yig’indisini hisoblasak:

void main() {
List<int> list = [1, 2, 3, 4];
var sum = 0;
for (var item in list) {
sum += item;
}
print(sum);
}
>> 10

Bu funksiya bilan aksincha, osonroq bo’ladi.

int reduce(int Function(int, int) combine)

Funksiyada ikki parametr mavjud. Birinchisi yig’ilgan qiymatni, ikkinchisi esa to’plamning joriy elementini ifodalaydi. Yuqorida yechim uchun reduce() funksiyasini qo’llaylik:

void main() {
List<int> list = [1, 2, 3, 4];
var sum = list.reduce((total, element) => total += element);
print(sum);
}
>> 10

total bu vaqtinchalik o’zgaruvchi bo’lib, unga umumiy qiymatni yig’ib boramiz. To’plam har bir elementi qiymati qo’shib o’zida saqlaydi va so’nggida eng oxirigi natijani sum nomli o’zgaruvchiga beradi.

fold() – ham reduce() fuksiyasi kabi to’plamning barcha elementlarini bitta qiymatga to’plash uchun imkon beradi.

T fold<T>(T initialValue, T Function(T, int) combine)

Funksiya sintaksisiga qarasak, bitta parametr ko’proqligini ko’ramiz. initialValue bu parametr boshlang’ich qiymat belgilab qo’yish uchun qo’llaniladi. Endi shu funksiya orqali ham to’plam elementlari yig’inidisini hisoblaylik:

void main() {
List<int> list = [1, 2, 3, 4];
var sum = list.fold(0, (total, element) => total += element);
print(sum);
}
>> 10

Sonlar yig’indisini topganimizda boshlang’ich qiymat 0 bo’lishi kerak va shuni initialValue parametriga qiymat sifatida berdik.

any() va every() funksiyalari to’plam elementlarining biror shartga mos kelishini tekshiradi. Bu funksiya parametri funksiya hisoblanadi.

bool any(bool Function(int) test)
bool every(bool Function(int) test)

any() – shartga kamida bitta element mos kelsa, true qiymat qaytaradi.

every() – barcha elementlar shartga javob bersa, true qiymat qaytaradi.

void main() {
List<int> list = [1, 2, 3, 4];
bool Every = list.every((e) => e > 0);
bool Any = list.any((e) => e % 2 == 0);
print("Every: $Every \nAny: $Any");
}
>> Every: true >> Any: true

Bu misolimizda list ning barcha elementlari every() funksiyasi orqali musbat sonligi tekshirib chiqilimoqda va unda qiymat true chiqdi. Hamda juft qiymatli elementlari mavjudligi uchun ham any() funksiya true qiymat qaytarmoqda.