من فکر می کنم نیازی به توضیح دادن به دانشجویان JavaRush نیست که مجموعه ها چیست و برای چیست. با این حال، پس از انتشار نسخه هشتم، بسیاری از عملیات های ابتدایی که قبلاً 6-7 خط کد می گرفتند، به حداقل ممکن ساده شدند. بدون هیچ مقدمه ای، در اینجا 10 تکنیک برتر Java8 Collections Framework آورده شده است که در زمان و مکان شما صرفه جویی می کند! سلام به همه دوستان! همانطور که می دانید عادت طبیعت دوم است. و با عادت کردن به نوشتن،
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
متد اضافه می کند .Map
key-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 عادت کردن به چیز جدید همیشه دشوار است، اما این تغییرات واقعا خوب هستند. در هر صورت، برخی از قسمت های کد من در حال حاضر قطعا کمتر از قبل شبیه اسپاگتی هستند :) اگر مقاله را دوست داشتید و دوست دارید موارد جدید را ببینید، فراموش نکنید که با کلیک روی "پسندیدن" یا "لایک" از نویسنده در مسابقه حمایت کنید. بهتر است، "لایک" :) در مطالعات خود موفق باشید!
GO TO FULL VERSION