JavaRush /وبلاگ جاوا /Random-FA /چرخه های نوشتن را متوقف کنید! 10 روش برتر برای کار با مجم...

چرخه های نوشتن را متوقف کنید! 10 روش برتر برای کار با مجموعه های جاوا 8

در گروه منتشر شد
من فکر می کنم نیازی به توضیح دادن به دانشجویان JavaRush نیست که مجموعه ها چیست و برای چیست. با این حال، پس از انتشار نسخه هشتم، بسیاری از عملیات های ابتدایی که قبلاً 6-7 خط کد می گرفتند، به حداقل ممکن ساده شدند. بدون هیچ مقدمه ای، در اینجا 10 تکنیک برتر Java8 Collections Framework آورده شده است که در زمان و مکان شما صرفه جویی می کند! چرخه های نوشتن را متوقف کنید!  10 روش برتر برای کار با مجموعه های جاوا 8 - 1سلام به همه دوستان! همانطور که می دانید عادت طبیعت دوم است. و با عادت کردن به نوشتن، for (int i = 0; i <......)اصلاً نمی‌خواهم آن را دوباره یاد بگیرم (مخصوصاً که این طراحی کاملاً ساده و قابل درک است). با این حال، در داخل حلقه ها ما اغلب همان عملیات ابتدایی را تکرار می کنیم، تکراری که واقعاً دوست داریم از شر آنها خلاص شویم. با انتشار Java8، Oracle تصمیم گرفت در این زمینه به ما کمک کند. در زیر 10 بهترین روش جمع آوری وجود دارد که در زمان و کد شما صرفه جویی می کند.

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

نام برای خودش صحبت می کند. از طریق مجموعه ارسال شده تکرار می شود و 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>)

هیچ چیز پیچیده ای هم نیست. روش از طریق مجموعه تکرار می شود و عناصری را که مطابقت دارند حذف می کند 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 + " "));
در یک خط همه اعداد بزرگتر از 5 را از لیست حذف می کنیم.

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

این متد forEachنه تنها برای کلاس هایی که اینترفیس را پیاده سازی می کنند Collection، بلکه برای 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، BiFunction<? super K، ? super V، ? گسترش V> remappingFunction)

کمی ترسناک تر به نظر می رسد، اما در واقعیت مانند همه موارد قبلی ساده است. برای کلید مشخص شده key، این روش مقدار را به نتیجه تابع تنظیم می کند remappingFunction. مثلا:
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 Philosophy " قطعا باحال است! :)

5. Map.computeIfAbsent (کلید K، تابع<? super K، ? گسترش V> mappingFunction)

این روش یک عنصر جدید به Map اضافه می کند ، اما تنها در صورتی که هیچ عنصری با همان کلید در آنجا وجود نداشته باشد. نتیجه valueاجرای تابع به آن اختصاص داده می شود mappingFunction. اگر عنصری با چنین کلیدی از قبل وجود داشته باشد، بازنویسی نمی شود، بلکه در جای خود باقی می ماند. بیایید به کتاب های خود برگردیم و روش جدیدی را امتحان کنیم:
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));
عملکرد ما mappingFunction:
public static String getHarryPotterAuthor() {
        return "Джоан Роулинг";
    }
و اینم کتاب جدید:
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Author: Джоан Роулинг
Название книги: Властелин Колец. Author: Джон Толкин

6. Map.computeIfPresent(کلید K، BiFunction<? super K، ? super V، ? extensions V> remappingFunction)

همان اصل، Map.compute()اما تمام محاسبات فقط در صورتی انجام می شود که عنصر دارای کلید 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));
هنگامی که تابع برای اولین بار فراخوانی شد، هیچ تغییری رخ نداد، زیرا Mapکتابی با عنوان "یوجین اونگین" در کتاب ما وجود ندارد. اما این برنامه برای دومین بار نویسنده کتاب "برادران کارامازوف" را به "الکساندر پوشکین" تغییر داد. نتیجه:
_________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_________________
Название книги: Братья Карамазовы. Author: Александр Пушкин
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

7. Map.getOrDefault (کلید شی، V مقدار پیش فرض)

مقدار مربوط به کلید را برمی گرداند key. اگر چنین کلیدی وجود نداشته باشد، مقدار پیش فرض را برمی گرداند.
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);
خیلی راحت:
Неизвестный автор

8. Map.merge (کلید K، مقدار V، BiFunction<? super V، ? super V، ? گسترش V> remappingFunction)

من حتی سعی نکردم محاسبه کنم که این روش چند خط کد شما را ذخیره می کند.
  • Mapاگر کلید در کلید شما keyوجود نداشته باشد یا valueبرای این کلید برابر باشد ، nullمتد اضافه می کند .Mapkey-value
  • اگر کلید Keyوجود داشته باشد و وجود داشته باشد، value != nullمتد آن را valueبه نتیجه اجرای تابع ارسال شده تغییر می دهد remappingFunction.
  • اگر remappingFunctionبرگردد null، keyاز مجموعه حذف می شود.
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));
نتیجه:
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
*ببخشید بروس*

9. Map.putIfAbsent (کلید K، مقدار V)

قبلاً برای اضافه کردن یک جفت به Mapآن در صورتی که وجود نداشت، باید کارهای زیر را انجام دهید:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
    map.put("Властелин Колец", "Джон Толкин");
اکنون همه چیز بسیار ساده تر شده است:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");

10. Map.replace و Map.replaceAll()

آخرین لیست، اما نه کم اهمیت ترین. - در صورت وجود چنین کلیدی، Map.replace(K key, V newValueمقدار کلید را keyبا . newValueاگر نه، هیچ اتفاقی نمی افتد. Map.replace(K key, V oldValue, V newValue)- همین کار را انجام می دهد، اما فقط در صورتی که مقدار فعلی keyباشد oldValue. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)- همه مقادیر را valueبا نتیجه اجرای تابع جایگزین می کند function. مثلا:
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: Джон Толкин
کار نمی کند! ارزش فعلی کلید برادران کارامازوف فئودور داستایوفسکی است، نه بروس ایکل، بنابراین هیچ چیز تغییر نکرده است.
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: Крутой писатель
به راحتی مقادیر کل نقشه را بدون هیچ ساختار پیچیده تغییر داد! PS عادت کردن به چیز جدید همیشه دشوار است، اما این تغییرات واقعا خوب هستند. در هر صورت، برخی از قسمت های کد من در حال حاضر قطعا کمتر از قبل شبیه اسپاگتی هستند :) اگر مقاله را دوست داشتید و دوست دارید موارد جدید را ببینید، فراموش نکنید که با کلیک روی "پسندیدن" یا "لایک" از نویسنده در مسابقه حمایت کنید. بهتر است، "لایک" :) در مطالعات خود موفق باشید!
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION