JavaRush /Java blogi /Random-UZ /Tsikllarni yozishni to'xtating! Java 8 to'plamlari bilan ...

Tsikllarni yozishni to'xtating! Java 8 to'plamlari bilan ishlashning 10 ta eng yaxshi usuli

Guruhda nashr etilgan
Menimcha, JavaRush talabalariga to'plamlar nima ekanligini va ular nima uchun ekanligini tushuntirishning hojati yo'q. Biroq, 8-versiya chiqarilgandan so'ng, ilgari 6-7 qator kodni olgan ko'plab elementar operatsiyalar minimal darajada soddalashtirildi. Ko'proq vaqt va joyni tejaydigan eng yaxshi 10 ta eng yaxshi Java8 Collections Framework texnikasi! Tsikllarni yozishni to'xtating!  Java 8-1 to'plamlari bilan ishlashning eng yaxshi 10 ta eng yaxshi usullariHammaga salom, do'stlar! Odat, siz bilganingizdek, ikkinchi tabiatdir. Va yozishga o'rganib qolganim sababli, for (int i = 0; i <......)men uni umuman qayta o'rganishni xohlamayman (ayniqsa, bu dizayn juda sodda va tushunarli). Biroq, ichki halqalar biz ko'pincha bir xil elementar operatsiyalarni takrorlaymiz, ularning takrorlanishidan xalos bo'lishni xohlaymiz. Java8-ning chiqarilishi bilan Oracle bu borada bizga yordam berishga qaror qildi. Quyida sizga ko'p vaqt va kodni tejaydigan 10 ta eng yaxshi yig'ish usullari keltirilgan.

1. Iterable.forEach(Consumer<? super T> amali)

Ism o'zi uchun gapiradi. O'tkazilgan to'plam orqali takrorlanadi va har bir element uchun lambda ifodasini bajaradi action.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.forEach(s -> System.out.print(s + " "));
1 2 3 4 5 6 7

2. Collection.removeIf(Predicate<? super E> filtri)

Hech narsa murakkab emas. Usul to'plam orqali takrorlanadi va mos keladigan elementlarni olib tashlaydi filter.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.removeIf(s -> s > 5);
 numbers.forEach(s -> System.out.print(s + " "));
Bir qatorda biz 5 dan katta barcha raqamlarni ro'yxatdan olib tashlaymiz.

3. Map.forEach(BiConsumer<? super K, ? super V> amal)

Usul forEachnafaqat interfeysni amalga oshiradigan sinflar uchun Collection, balki uchun ham ishlaydi Map.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

4. Map.compute(K tugmasi,BiFunction<? super K, ? super V, ? V> remappingFunction-ni kengaytiradi)

Bu biroz qo'rqinchli ko'rinadi, lekin aslida hamma avvalgilar kabi oddiy. Belgilangan kalit uchun keyushbu usul funktsiya natijasiga qiymat o'rnatadi remappingFunction. Masalan:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));

books.compute("Философия Java", (a,b) -> b+", крутой чувак");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_______________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель, крутой чувак
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
" Java falsafasi " muallifi , albatta, ajoyib! :)

5. Map.computeIfAbsent(K tugmasi, Function<? super K, ? V> mappingFunction-ni kengaytiradi)

Usul Map ga yangi element qo'shadi , lekin faqat bir xil kalitga ega element mavjud bo'lmasa. Funktsiyani bajarish natijasi valueunga tayinlanadi mappingFunction. Agar shunday kalitga ega element allaqachon mavjud bo'lsa, u qayta yozilmaydi, lekin joyida qoladi. Keling, kitoblarimizga qaytib, yangi usulni sinab ko'raylik:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.computeIfAbsent("Гарри Поттер и узник Азкабана", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Bizning funktsiyamiz mappingFunction:
public static String getHarryPotterAuthor() {
        return "Джоан Роулинг";
    }
Va mana yangi kitob:
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Author: Джоан Роулинг
Название книги: Властелин Колец. Author: Джон Толкин

6. Map.computeIfPresent(K tugmasi, BiFunction<? super K, ? super V, ? V> remappingFunction-ni kengaytiradi)

bilan bir xil printsip, Map.compute()lekin barcha hisoblar faqat kalitga ega element keyallaqachon mavjud bo'lsa amalga oshiriladi.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.computeIfPresent("Евгений Онегин", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
books.computeIfPresent("Братья Карамазовы", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Funktsiya birinchi marta chaqirilganda, hech qanday o'zgarishlar yuz bermadi, chunki Mapbizda "Eugene Onegin" nomli kitob yo'q. Ammo dastur ikkinchi marta "Aka-uka Karamazovlar" kitobining muallifini "Aleksandr Pushkin" ga o'zgartirdi. Xulosa:
_________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_________________
Название книги: Братья Карамазовы. Author: Александр Пушкин
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

7. Map.getOrDefault(Obyekt kaliti, V defaultValue)

Kalitga mos keladigan qiymatni qaytaradi key. Agar bunday kalit mavjud bo'lmasa, standart qiymatni qaytaradi.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

String igor = books.getOrDefault("Слово о полку Игореве", "Неизвестный автор");
System.out.println(igor);
Juda qulay:
Неизвестный автор

8. Map.merge(K tugmasi, V qiymati, BiFunction<? super V, ? super V, ? V> remappingFunction-ni kengaytiradi)

Men bu usul sizni qancha kod qatorini saqlashini hisoblashga ham urinmadim.
  • MapAgar kalit sizniki keybo'lmasa yoki valuebu kalit uchun teng bo'lsa , nullusul qo'shadi .Mapkey-value
  • Agar kalit Keymavjud bo'lsa va u mavjud bo'lsa, value != nullusul uni valueo'tkazilgan funktsiyani bajarish natijasiga o'zgartiradi remappingFunction.
  • Agar remappingFunctionu qaytsa null, keyu to'plamdan o'chiriladi.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.merge("Философия Java", "Брюс Эккель", (a, b) -> b +  " и кто-то там еще");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
Xulosa:
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
*kechirasiz Bryus*

9. Map.putIfAbsent(K tugmasi, V qiymati)

MapIlgari, agar u bo'lmasa, juftlikni qo'shish uchun siz quyidagilarni qilishingiz kerak edi:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
    map.put("Властелин Колец", "Джон Толкин");
Endi hamma narsa ancha soddalashdi:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");

10. Map.replace va Map.replaceAll()

Ro'yxatda oxirgi, lekin kamida. Map.replace(K key, V newValue— kalit qiymatini keybilan almashtiradi newValue, agar shunday kalit mavjud bo'lsa. Agar yo'q bo'lsa, hech narsa bo'lmaydi. Map.replace(K key, V oldValue, V newValue)- xuddi shu ishni bajaradi, lekin faqat joriy qiymat keybo'lsa oldValue. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)— barcha qiymatlarni valuefunksiya bajarilishi natijasi bilan almashtiradi function. Masalan:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.replace("Братья Карамазовы", "Брюс Эккель", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
Ishlamadi! Birodarlar Karamazov kalitining hozirgi qiymati Bryus Ekkel emas, Fyodor Dostoevskiy, shuning uchun hech narsa o'zgarmadi.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.replaceAll((a,b) -> getCoolWriter());
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
public static String getCoolWriter() {
        return "Крутой писатель";
    }
Название:Братья Карамазовы. Author: Крутой писатель
Название:Философия Java. Author: Крутой писатель
Название:Преступление и наказание. Author: Крутой писатель
Название:Война и мир. Author: Крутой писатель
Название:Властелин Колец. Author: Крутой писатель
Hech qanday murakkab tuzilmalarsiz butun Xarita uchun qiymatlarni osongina o'zgartiring! PS Yangi narsaga ko'nikish har doim qiyin, lekin bu o'zgarishlar haqiqatan ham yaxshi. Qanday bo'lmasin, mening kodimning ba'zi qismlari endi avvalgiga qaraganda kamroq spagettiga o'xshaydi :) Agar sizga maqola yoqqan bo'lsa va yangilarini ko'rishni istasangiz, "Like" tugmasini bosib tanlovda muallifni qo'llab-quvvatlashni unutmang yoki yaxshiroq, "Like" :) O'qishlaringizga omad!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION