אני חושב שאין צורך להסביר לתלמידי JavaRush מה זה אוספים ולמה הם מיועדים. עם זאת, לאחר שחרורו של הגרסה ה-8, פעולות בסיסיות רבות, שבעבר לקחו 6-7 שורות קוד, פשטו למינימום. בלי להתעסק יותר, הנה 10 טכניקות המסגרת הטובות ביותר של Java8 Collections שיחסכו לך טונות של זמן ומקום! שלום לכולם, חברים! הרגל, כידוע, הוא טבע שני. ואחרי שהתרגלתי לכתוב,
for (int i = 0; i <......)
אני לא רוצה ללמוד את זה מחדש בכלל (במיוחד שהעיצוב הזה די פשוט ומובן). עם זאת, בתוך לולאות אנו חוזרים פעמים רבות על אותן פעולות אלמנטריות, שאת החזרה עליהן היינו מאוד רוצים להיפטר. עם שחרורו של Java8, אורקל החליטה לעזור לנו בכך. להלן 10 שיטות האיסוף הטובות ביותר שיחסכו לך המון זמן וקוד.
1. Iterable.forEach(פעולה Consumer<? super T>)
השם מדבר בעד עצמו. חוזר דרך האוסף שעבר ומבצע ביטוי למבדה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>)
השיטה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 key,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: Джон Толкин
המחבר של " פילוסופיית ג'אווה " בהחלט מגניב! :)
5. Map.computeIfAbsent(מקש K, Function<? super K, ? מרחיב את V> mappingFunction)
השיטה תוסיף אלמנט חדש למפה , אבל רק אם האלמנט עם אותו מפתח לא נמצא שם. תוצאת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, ? מרחיב את 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 defaultValue)
מחזירה את הערך המתאים למפתח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: Крутой писатель
שנה בקלות את הערכים עבור המפה כולה ללא שום קונסטרוקציות מורכבות! נ.ב. להתרגל למשהו חדש זה תמיד קשה, אבל השינויים האלה ממש טובים. בכל מקרה, חלקים מסוימים בקוד שלי עכשיו בהחלט פחות דמויי ספגטי מבעבר :) אם אהבתם את המאמר ותרצו לראות חדשים, אל תשכחו לתמוך בכותב בתחרות על ידי לחיצה על "אהבתי", או יותר טוב, "לייק" :) בהצלחה בלימודים!
GO TO FULL VERSION