पळवाट लिहिणे थांबवा!  Java 8 - 1 मधील संग्रहांसह कार्य करण्यासाठी शीर्ष 10 सर्वोत्तम पद्धती तुम्हाला माहिती आहेच की, आपल्या सवयी हा दुसरा स्वभाव आहे. आणि एकदा का तुम्हाला लिहिण्याची सवय झाली की for (int i = 0; i <......), तुमच्यातील कोणत्याही भागाला ही रचना पुन्हा शिकण्याची गरज नाही (विशेषत: ते अगदी सोपे आणि समजण्यासारखे आहे). तथापि, समान मूलभूत ऑपरेशन्स करण्यासाठी लूपचा वारंवार वापर केला जातो आणि पुनरावृत्ती ही अशी गोष्ट आहे ज्यापासून आपण मुक्त होऊ इच्छितो. Java 8 सह, ओरॅकलने आम्हाला हे करण्यात मदत करण्याचा निर्णय घेतला आहे. खाली 10 सर्वोत्कृष्ट संकलन पद्धती आहेत ज्या तुमचा बराच वेळ आणि कोड वाचवतील.

1. Iterable.forEach(ग्राहक <? सुपर T> क्रिया)

नाव स्वतःच बोलते. वितर्क म्हणून पास केलेल्या संग्रहावर ते पुनरावृत्ती करते आणि त्याच्या प्रत्येक घटकासाठी क्रिया lambda अभिव्यक्ती कार्यान्वित करते.

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("War and Peace", "Leo Tolstoy");
 books.put("Crime and Punishment", "Fyodor Dostoevsky");
 books.put("Thinking in Java", "Bruce Eckel");
 books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
 books.put("The Lord of the Rings", "John Tolkien");
 books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));

Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien

4. Map.compute (K की, BiFunction<? Super K,? Super V,? विस्तारित करते V> remappingFunction)

थोडे अधिक भीतीदायक दिसते, परंतु खरं तर, मागील सर्वांप्रमाणेच सोपे. ही पद्धत keyकार्यान्वित करण्याच्या परिणामाप्रमाणे मूल्य सेट करते mappingFunction. उदाहरणार्थ:

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
 
books.compute("Thinking in Java", (a,b) -> b + ", cool dude");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));

Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
_______________________
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel, cool dude
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
"थिंकिंग इन जावा" चा लेखक नक्कीच मस्त आहे! :)

5. Map.computeIfAbsent(K की, फंक्शन <? सुपर के, ? विस्तारित करते V> मॅपिंग फंक्शन)

ही पद्धत मध्ये एक नवीन घटक जोडेल Map, परंतु जर त्यामध्ये आधीपासून त्या कीसह घटक नसेल तरच. नियुक्त मूल्य कार्यान्वित केल्याने परिणाम होईल mappingFunction. की सह घटक आधीच अस्तित्वात असल्यास, तो अधिलिखित होणार नाही. ते जसे आहे तसे राहील. चला आमच्या पुस्तकांकडे परत येऊ आणि एक नवीन पद्धत वापरून पाहू:

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
books.computeIfAbsent("Harry Potter and the Prisoner of Azkaban", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
येथे आमचे आहे mappingFunction:

public static String getHarryPotterAuthor() {
        return "Joanne Rowling";
    }
आणि हे नवीन पुस्तक आहे:

Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Harry Potter and the Prisoner of Azkaban. Author: Joanne Rowling
Book title: Lord of the Rings. Author: John Tolkien

6. Map.computeIfPresent(K की, BiFunction<? super K, ? super V, ? विस्तारित V> remappingFunction)

येथे आपल्याकडे समान तत्त्व आहे Map.compute(), परंतु गणना केवळ तेव्हाच केली जाते जेव्हा एखादी वस्तू keyआधीपासूनच अस्तित्वात असेल.

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
books.computeIfPresent("Eugene Onegin", (a,b) -> b = "Alexander Pushkin");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
books.computeIfPresent("The Brothers Karamazov", (a,b) -> b = "Alexander Pushkin");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
फंक्शनच्या पहिल्या कॉलमध्ये कोणतेही बदल झाले नाहीत, कारण आमच्या . मध्ये "युजीन वनगिन" नावाचे कोणतेही पुस्तक नाही Map. परंतु दुसर्‍या कॉलमध्ये, कार्यक्रमाने "द ब्रदर्स करामाझोव्ह" या पुस्तकाचे लेखक अलेक्झांडर पुष्किनमध्ये बदलले. आउटपुट:

_________________
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
 _________________
Book title: The Brothers Karamazov. Author: Alexander Pushkin
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien

7. Map.getOrDefault(Object key, V defaultValue)

ही पद्धत शी संबंधित मूल्य परत करते key. की अस्तित्वात नसल्यास, ते डीफॉल्ट मूल्य परत करते.

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
String igor = books.getOrDefault("The Tale of Igor's Campaign", "Unknown author");
System.out.println(igor);
हे खूप सोयीस्कर आहे:

Unknown author

8. Map.merge(K की, V मूल्य, BiFunction<? super V, ? super V, ? विस्तारित V> remappingFunction)

कोडच्या किती ओळी ही पद्धत तुम्हाला वाचवेल याची गणना करण्याचा मी प्रयत्न केला नाही.
  1. जर keyतुमच्या मध्ये अस्तित्वात नसेल Map, किंवा जर valueया की साठी असेल null, तर पद्धत पास केलेली key-valueजोडी मध्ये जोडते Map.
  2. जर keyअस्तित्वात असेल आणि त्याचे असेल value != null, तर पद्धत अंमलात आणण्याच्या परिणामात त्याचे मूल्य बदलते remappingFunction.
  3. remappingFunctionपरत आल्यास , nullसंग्रहातून keyकाढून टाकले जाते.

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
books.merge("Thinking in Java", "Bruce Eckel", (a, b) -> b + " and some coauthor");
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));
आउटपुट:

Title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Title: Thinking in Java. Author: Bruce Eckel and some coauthor
Title: Crime and Punishment. Author: Fyodor Dostoevsky
Title: War and Peace. Author: Leo Tolstoy
Title: Lord of the Rings. Author: John Tolkien
*माफ करा, ब्रुस*

9. Map.putIfAbsent(K की, V मूल्य)

पूर्वी, a मध्ये जोडी जोडण्यासाठी Map, जर ते आधीपासून नसेल तर, तुम्हाला पुढील गोष्टी कराव्या लागतील:

Map <String, String> map = new HashMap<>();
if (map.get("Lord of the Rings") == null)
    map.put("Lord of the Rings", "John Tolkien");
आता सर्वकाही खूप सोपे झाले आहे:

Map<String, String> map = new HashMap<>();
map.putIfAbsent("Lord of the Rings", "John Tolkien");

10. Map.replace आणि Map.replaceAll()

शेवटचे पण महत्त्वाचे.
  1. Map.replace(K key, V newValue)जर अशी की अस्तित्वात असेल तर keyचे मूल्य सोबत बदलते . newValueनाही तर काहीच होत नाही.
  2. Map.replace(K key, V oldValue, V newValue)समान गोष्ट करते, परंतु जर वर्तमान मूल्य keyबरोबर असेल तरच oldValue.
  3. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)प्रत्येकाला valueफंक्शनच्या परिणामासह बदलते.
उदाहरणार्थ:

Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
books.replace("The Brothers Karamazov", "Bruce Eckel", "John Tolkien");
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));

Title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Title: Thinking in Java. Author: Bruce Eckel
Title: Crime and Punishment. Author: Fyodor Dostoevsky
Title: War and Peace. Author: Leo Tolstoy
Title: Lord of the Rings. Author: John Tolkien
ते काम केले नाही! "द ब्रदर्स करामाझोव्ह" की वर्तमान मूल्य "फ्योडोर दोस्तोव्हस्की" आहे, "ब्रूस एकेल" नाही, त्यामुळे काहीही बदललेले नाही.

Map  books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
 
books.replaceAll((a,b) -> getCoolAuthor());
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));

public static String getCoolAuthor() {
        return "Cool author";
     }

Title: The Brothers Karamazov. Author: Cool author
Title: Thinking in Java. Author: Cool author
Title: Crime and Punishment. Author: Cool author
Title: War and Peace. Author: Cool author
Title: Lord of the Rings. Author: Cool author
Mapआम्ही कोणत्याही क्लिष्ट रचनांशिवाय संपूर्ण मूल्ये सहजपणे बदलली ! PS नवीन सवय लावणे नेहमीच कठीण असते, परंतु हे बदल खरोखर चांगले आहेत. कोणत्याही परिस्थितीत, माझ्या कोडचे काही भाग पूर्वीपेक्षा निश्चितपणे स्पॅगेटीसारखे कमी आहेत :) शिकण्यासाठी शुभेच्छा!