JavaRush /Java Blogu /Random-AZ /Dövr yazmağı dayandırın! Java 8-dən kolleksiyalarla işləm...

Dövr yazmağı dayandırın! Java 8-dən kolleksiyalarla işləmək üçün ən yaxşı 10 üsul

Qrupda dərc edilmişdir
Məncə, JavaRush tələbələrinə kolleksiyaların nə olduğunu və nə üçün olduğunu izah etməyə ehtiyac yoxdur. Ancaq 8-ci versiyanın buraxılmasından sonra əvvəllər 6-7 sətir kod götürən bir çox elementar əməliyyatlar minimuma qədər sadələşdirildi. Daha çox uzatmadan, sizə tonlarla vaxt və məkana qənaət edəcək ən yaxşı 10 ən yaxşı Java8 Collections Framework texnikası buradadır! Dövr yazmağı dayandırın!  Java 8 - 1-dən kolleksiyalarla işləmək üçün ən yaxşı 10 ən yaxşı üsulHər kəsə salam dostlar! Vərdiş, bildiyiniz kimi, ikinci təbiətdir. Və yazmağa öyrəşdiyim üçün for (int i = 0; i <......)onu ümumiyyətlə yenidən öyrənmək istəmirəm (xüsusilə bu dizayn olduqca sadə və başa düşülən olduğundan). Bununla birlikdə, döngələr içərisində biz tez-tez eyni elementar əməliyyatları təkrarlayırıq, təkrarlanmasından həqiqətən xilas olmaq istəyirik. Java8-in buraxılması ilə Oracle bu işdə bizə kömək etmək qərarına gəldi. Aşağıda sizə bir ton vaxt və kod qənaət edəcək 10 ən yaxşı toplama üsulu verilmişdir.

1. Iterable.forEach(İstehlakçı<? super T> əməliyyatı)

Adı özü üçün danışır. Keçirilmiş kolleksiyanı təkrarlayır və actionhər bir element üçün lambda ifadəsini yerinə yetirir.
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(Predikat<? super E> filtri)

Heç bir şey mürəkkəb deyil. Metod kolleksiyada təkrarlanır və uyğun gələn elementləri silir 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 sətirdə 5-dən çox olan bütün nömrələri siyahıdan çıxarırıq.

3. Map.forEach(BiConsumer<? super K, ? super V> fəaliyyət)

Metod forEachyalnız interfeysi həyata keçirən siniflər üçün deyil Collection, həm də 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 düyməsi,BiFunction<? super K, ? super V, ? V> remappingFunction-ı genişləndirir)

Bir az daha qorxuducu görünür, amma əslində bütün əvvəlkilər kimi sadədir. Göstərilən açar üçün keybu üsul funksiyanın nəticəsi üçün dəyər təyin edir remappingFunction. Misal üçün:
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 Fəlsəfəsi " nin müəllifi mütləq gözəldir! :)

5. Map.computeIfAbsent(K düyməsi, Function<? super K, ? V> mappingFunction-ı genişləndirir)

Metod Xəritəyə yeni element əlavə edəcək , lakin eyni açarı olan element orada olmadıqda. Funksiya icrasının nəticəsi valueona təyin ediləcək mappingFunction. Əgər belə açarı olan element artıq mövcuddursa, onun üzərinə yazılmayacaq, lakin yerində qalacaq. Gəlin kitablarımıza qayıdıb yeni metodu sınayaq:
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));
Bizim funksiyamız mappingFunction:
public static String getHarryPotterAuthor() {
        return "Джоан Роулинг";
    }
Və budur yeni kitab:
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Author: Джоан Роулинг
Название книги: Властелин Колец. Author: Джон Толкин

6. Map.computeIfPresent(K düyməsi, BiFunction<? super K, ? super V, ? V> remappingFunction-ı genişləndirir)

ilə eyni prinsipdir, Map.compute()lakin bütün hesablamalar yalnız açarı olan element artıq mövcud olduqda yerinə yetiriləcəkdir key.
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));
Funksiya ilk dəfə çağırılanda heç bir dəyişiklik baş vermədi, çünki Mapbizdə "Yevgeni Onegin" adlı kitab yoxdur. Lakin ikinci dəfə proqram “Karamazov qardaşları” kitabının müəllifini “Aleksandr Puşkin”ə dəyişdi. Nəticə:
_________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_________________
Название книги: Братья Карамазовы. Author: Александр Пушкин
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

7. Map.getOrDefault(Obyekt açarı, V defaultValue)

Açara uyğun dəyəri qaytarır key. Əgər belə açar yoxdursa, standart dəyəri qaytarır.
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);
Çox rahat:
Неизвестный автор

8. Map.merge(K düyməsi, V dəyəri, BiFunction<? super V, ? super V, ? V> remappingFunction-ı genişləndirir)

Bu metodun sizi neçə sətir koddan xilas edəcəyini hesablamağa belə cəhd etmədim.
  • MapƏgər açar sizinkində keyyoxdursa və ya valuebu açar üçün bərabərdirsə , nullmetod əlavə edir .Mapkey-value
  • Açar Keyvarsa və oradadırsa, value != nullmetod onu valueötürülən funksiyanın yerinə yetirilməsinin nəticəsi kimi dəyişir remappingFunction.
  • Qaytararsa , kolleksiyadan silinir remappingFunction.nullkey
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));
Nəticə:
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
*bağışlayın Bruce*

9. Map.putIfAbsent(K düyməsi, V dəyəri)

Əvvəllər, əgər orada deyilsə, bir cüt əlavə etmək üçün Mapaşağıdakıları etməli idiniz:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
    map.put("Властелин Колец", "Джон Толкин");
İndi hər şey daha sadə oldu:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");

10. Map.replace və Map.replaceAll()

Siyahıda sonuncu, lakin ən azı. Map.replace(K key, V newValue— açar dəyərini keyilə əvəz edir newValue, əgər belə bir açar varsa. Yoxdursa, heç nə olmur. Map.replace(K key, V oldValue, V newValue)- eyni şeyi edir, ancaq cari dəyər keyolduqda oldValue. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)— bütün dəyərləri valuefunksiyanın icrasının nəticəsi ilə əvəz edir function. Misal üçün:
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: Джон Толкин
İşləmədi! Karamazov Qardaşları açarının indiki dəyəri Bruce Eckel deyil, Fyodor Dostoyevskidir, ona görə də heç nə dəyişməyib.
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: Крутой писатель
Heç bir mürəkkəb konstruksiya olmadan bütün Xəritə üçün dəyərləri asanlıqla dəyişdirin! PS Yeni bir şeyə alışmaq həmişə çətindir, lakin bu dəyişikliklər həqiqətən yaxşıdır. Hər halda, kodumun bəzi hissələri indi əvvəlkindən daha az spagettiyə bənzəyir :) Məqaləni bəyəndinizsə və yenilərini görmək istəyirsinizsə, “Bəyən” düyməsini sıxaraq müsabiqədə müəllifə dəstək olmağı unutmayın. daha yaxşısı, “Bəyən” :) Təhsilinizdə uğurlar!
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION