CodeGym/Java Blog/अनियमित/लूप लिखना बंद करो! जावा 8 में संग्रह के साथ काम करने के ल...
John Squirrels
स्तर 41
San Francisco

लूप लिखना बंद करो! जावा 8 में संग्रह के साथ काम करने के लिए शीर्ष 10 सर्वोत्तम अभ्यास

अनियमित ग्रुप में प्रकाशित
सदस्य
लूप लिखना बंद करो!  जावा 8 - 1 में संग्रह के साथ काम करने के लिए शीर्ष 10 सर्वोत्तम अभ्यास जैसा कि आप जानते हैं, हमारी आदतें दूसरी प्रकृति हैं। और एक बार जब आप लिखने के अभ्यस्त हो जाते हैं for (int i = 0; i <......), तो आप में से कोई भी हिस्सा इस रचना को फिर से सीखना नहीं चाहता है (विशेषकर चूंकि यह काफी सरल और समझने योग्य है)। हालाँकि, समान बुनियादी संचालन करने के लिए अक्सर लूप का बार-बार उपयोग किया जाता है, और दोहराव एक ऐसी चीज है जिससे हम छुटकारा पाना चाहेंगे। Java 8 के साथ, Oracle ने ऐसा करने में हमारी मदद करने का निर्णय लिया है। नीचे 10 सर्वोत्तम संग्रह विधियाँ दी गई हैं जो आपका बहुत समय और कोड बचाएंगी।

1. Iterable.forEach (उपभोक्ता <? सुपर टी> कार्रवाई)

नाम ही अपने में काफ़ी है। यह एक तर्क के रूप में पारित संग्रह पर पुनरावृति करता है, और इसके प्रत्येक तत्व के लिए क्रिया लैम्ब्डा अभिव्यक्ति को निष्पादित करता है।
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)

फिर, यहाँ कुछ भी मुश्किल नहीं है। विधि संग्रह पर पुनरावृति करती है और मेल खाने वाले किसी भी तत्व को हटा देती है 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 <? सुपर K, ? सुपर 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 कुंजी, फंक्शन <? सुपर 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<? सुपर K, ? सुपर 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 (ऑब्जेक्ट कुंजी, V डिफ़ॉल्ट वैल्यू)

यह विधि इसके अनुरूप मान लौटाती है 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<? सुपर V, ? सुपर 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. मैप.रिप्लेस और मैप.रिप्लेसअल ()

आखिरी बात भी बहुत महत्वपूर्ण है।
  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 नए के लिए अभ्यस्त होना हमेशा कठिन होता है, लेकिन ये बदलाव वास्तव में अच्छे हैं। किसी भी घटना में, मेरे कोड के कुछ हिस्से निश्चित रूप से पहले की तुलना में स्पेगेटी की तरह कम हैं :) सीखने में शुभकामनाएँ!
टिप्पणियां
  • लोकप्रिय
  • नया
  • पुराना
टिप्पणी लिखने के लिए आपको साइन इन करना होगा
इस पेज पर अभी तक कोई टिप्पणियां नहीं हैं