أعتقد أنه ليست هناك حاجة لشرح لطلاب JavaRush ما هي المجموعات وما الغرض منها. ومع ذلك، بعد إصدار الإصدار الثامن، تم تبسيط العديد من العمليات الأولية، التي استغرقت في السابق 6-7 أسطر من التعليمات البرمجية، إلى الحد الأدنى. دون مزيد من اللغط، إليك أفضل 10 تقنيات لإطار عمل مجموعات Java8 والتي ستوفر لك الكثير من الوقت والمساحة! مرحبا بالجميع أيها الأصدقاء! العادة، كما تعلم، هي طبيعة ثانية. وبعد أن اعتدت على الكتابة،
for (int i = 0; i <......)
لا أريد أن أتعلمها مرة أخرى على الإطلاق (خاصة وأن هذا التصميم بسيط للغاية ومفهوم). ومع ذلك، داخل الحلقات غالبًا ما نكرر نفس العمليات الأولية، والتي نود حقًا التخلص من تكرارها. مع إصدار Java8، قررت Oracle مساعدتنا في هذا الأمر. فيما يلي أفضل 10 طرق للتجميع ستوفر لك الكثير من الوقت والأكواد.
1. Iterable.forEach (إجراء المستهلك <؟ 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 (مرشح المسند<؟ 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,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، الوظيفة<؟ 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 key, BiFunction<? super K, ? super V, ? Extends 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
لا يوجد كتاب بعنوان "Eugene Onegin" في كتابنا. لكن للمرة الثانية قام البرنامج بتغيير مؤلف كتاب «الإخوة كارامازوف» إلى «ألكسندر بوشكين». خاتمة:
_________________
Название книги: Братья Карамазовы. 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