JavaRush /בלוג Java /Random-HE /תפסיק לכתוב מחזורים! 10 השיטות הטובות ביותר לעבודה עם אוס...

תפסיק לכתוב מחזורים! 10 השיטות הטובות ביותר לעבודה עם אוספים מ-Java 8

פורסם בקבוצה
אני חושב שאין צורך להסביר לתלמידי JavaRush מה זה אוספים ולמה הם מיועדים. עם זאת, לאחר שחרורו של הגרסה ה-8, פעולות בסיסיות רבות, שבעבר לקחו 6-7 שורות קוד, פשטו למינימום. בלי להתעסק יותר, הנה 10 טכניקות המסגרת הטובות ביותר של Java8 Collections שיחסכו לך טונות של זמן ומקום! תפסיק לכתוב מחזורים!  10 השיטות הטובות ביותר לעבודה עם אוספים מ-Java 8 - 1שלום לכולם, חברים! הרגל, כידוע, הוא טבע שני. ואחרי שהתרגלתי לכתוב, 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השיטה מוסיפה .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: Крутой писатель
שנה בקלות את הערכים עבור המפה כולה ללא שום קונסטרוקציות מורכבות! נ.ב. להתרגל למשהו חדש זה תמיד קשה, אבל השינויים האלה ממש טובים. בכל מקרה, חלקים מסוימים בקוד שלי עכשיו בהחלט פחות דמויי ספגטי מבעבר :) אם אהבתם את המאמר ותרצו לראות חדשים, אל תשכחו לתמוך בכותב בתחרות על ידי לחיצה על "אהבתי", או יותר טוב, "לייק" :) בהצלחה בלימודים!
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION