मानचित्र प्रविष्टि सेट के लिए forEach पाश जावा 8


82

मैं java7 से java8 तक प्रत्येक लूप के लिए पुराने पारंपरिक को मैप एंट्री सेट के लिए बदलने की कोशिश कर रहा हूं, लेकिन मुझे एक त्रुटि मिल रही है। यहां वह कोड है जिसे मैं बदलने की कोशिश कर रहा हूं:

for (Map.Entry<String, String> entry : map.entrySet()) {
        System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
    }

यहां मैंने जो बदलाव किए हैं:

map.forEach( Map.Entry<String, String> entry -> {
       System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());

   }); 

मैंने ऐसा करने की कोशिश की:

Map.Entry<String, String> entry;
   map.forEach(entry -> {
       System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());

   });

लेकिन फिर भी त्रुटि का सामना करना पड़ रहा है। इसके लिए मुझे जो त्रुटि मिल रही है वह यह है: लैम्ब्डा अभिव्यक्ति का हस्ताक्षर कार्यात्मक इंटरफ़ेस विधि के हस्ताक्षर से मेल नहीं खाता हैaccept(String, String)

जवाबों:


193

जावदोक पढ़ें : Map<K, V>.forEach()एक BiConsumer<? super K,? super V>तर्क के रूप में, और BiConsumer<T, U>अमूर्त विधि का हस्ताक्षर है accept(T t, U u)

तो आपको इसे एक लंबोदर अभिव्यक्ति के रूप में पारित करना चाहिए जो तर्क के रूप में दो इनपुट लेता है: कुंजी और मूल्य:

map.forEach((key, value) -> {
    System.out.println("Key : " + key + " Value : " + value);
});

यदि आप मानचित्र पर प्रविष्टि सेट पर forEach () कहते हैं तो आपका कोड काम करेगा, न कि मानचित्र पर:

map.entrySet().forEach(entry -> {
    System.out.println("Key : " + entry.getKey() + " Value : " + entry.getValue());
}); 

महान। अब दोनों काम कर रहे हैं। लेकिन कौन सा बेहतर तरीका है? किस मामले में प्रदर्शन बेहतर होगा? @ जेबीएनज़ेट
सिद्धार्थ सचदेवा

2
दूसरा संस्करण Map.Entryप्रत्येक प्रविष्टि के लिए एक उदाहरण बनने के लिए मजबूर करता है ; पहले वाला आपको बिना किसी तात्कालिकता के कुंजी और मूल्य देता है। इसलिए Map.Entryएक बिचौलिया है और आप पहले संस्करण का उपयोग करने से बच सकते हैं।
मार्को टोपोलनिक

5
@ मार्को टोपोलनिक: अधिकांश Mapकार्यान्वयनों के लिए, Map.Entryउदाहरण पहले से ही पुनरावृत्ति से पहले मौजूद हैं और इसे बनाने की आवश्यकता नहीं है। फिर भी, Map.Entryकार्रवाई से निपटने के लिए पठनीयता पर जीत नहीं है और बेहतर प्रदर्शन के लिए थोड़ी संभावना है क्योंकि कुंजी और मूल्य को पुनः प्राप्त करने के लिए कोई अतिरिक्त विधि चालान की आवश्यकता नहीं है।
होल्गर

2
@ होल्गर मैं आपके टैसिट निहितार्थ पर जोर दूंगा: अधिकांश के लिए, लेकिन सभी नहीं , Mapकार्यान्वयन जो कि सच है, ConcurrentHashMapएक महत्वपूर्ण प्रतिधारण है।
मार्को टोपोलनिक

1
@ मार्को टोपोलनिक: लेकिन जब एक संपूर्ण पर पुनरावृत्ति होती है ConcurrentHashMap, तो अस्थायी प्रवेश उदाहरणों के बारे में चिंता करने की अंतिम बात है। फिर भी, हम map.forEach((key, value) -> …);वैसे भी पसंद करने पर सहमत हैं ...
होलगर

13

शायद सवालों का जवाब देने का सबसे अच्छा तरीका है "कौन सा संस्करण तेज है और मुझे कौन सा उपयोग करना चाहिए?" स्रोत कोड देखना है:

map.forEach () - Map.java से

default void forEach(BiConsumer<? super K, ? super V> action) {
    Objects.requireNonNull(action);
    for (Map.Entry<K, V> entry : entrySet()) {
        K k;
        V v;
        try {
            k = entry.getKey();
            v = entry.getValue();
        } catch(IllegalStateException ise) {
            // this usually means the entry is no longer in the map.
            throw new ConcurrentModificationException(ise);
        }
        action.accept(k, v);
    }
}

जावाडोक

map.entrySet ()। forEach () - Iterable.java से

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

जावाडोक

इससे तुरंत पता चलता है कि map.forEach () आंतरिक रूप से Map.Entry का भी उपयोग कर रहा है । तो मैं किसी भी प्रदर्शन का उपयोग करने में लाभ की उम्मीद नहीं होता ) map.forEach ( अधिक map.entrySet ()। Foreach () । तो आपके मामले में जवाब वास्तव में आपके व्यक्तिगत स्वाद पर निर्भर करता है :)

मतभेदों की पूरी सूची के लिए कृपया दिए गए javadoc लिंक को देखें। हैप्पी कोडिंग!


7

आप अपनी आवश्यकता के लिए निम्न कोड का उपयोग कर सकते हैं

map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));

2
यह उत्तर 2 साल पहले जेबी निज़ेट द्वारा प्रदान किए गए उत्तर के भाग के समान है और कोई अतिरिक्त, उपयोगी जानकारी प्रदान नहीं करता है।
मडब्रेक्स

0
HashMap<String,Integer> hm = new HashMap();

 hm.put("A",1);
 hm.put("B",2);
 hm.put("C",3);
 hm.put("D",4);

 hm.forEach((key,value)->{
     System.out.println("Key: "+key + " value: "+value);
 });

कृपया अपने उत्तर में कुछ स्पष्टीकरण जोड़ें। इससे दूसरों को आपकी ज़रूरतों के बारे में आपके उत्तर को अपनाने में मदद मिलेगी। समीक्षा से
वाई हा ली

0

स्ट्रीम एपीआई

public void iterateStreamAPI(Map<String, Integer> map) {
    map.entrySet().stream().forEach(e -> System.out.println(e.getKey() + ":"e.getValue()));
}

0
String ss = "Pawan kavita kiyansh Patidar Patidar";
    StringBuilder ress = new StringBuilder();
    
    Map<Character, Integer> fre = ss.chars().boxed()
            .collect(Collectors.toMap(k->Character.valueOf((char) k.intValue()),k->1,Integer::sum));
    
      //fre.forEach((k, v) -> System.out.println((k + ":" + v)));
    
    fre.entrySet().forEach(e ->{
            //System.out.println(e.getKey() + ":" + e.getValue());
            //ress.append(String.valueOf(e.getKey())+e.getValue());
        }); 

    fre.forEach((k,v)->{
        //System.out.println("Item : " + k + " Count : " + v);
        ress.append(String.valueOf(k)+String.valueOf(v));
    });
    
    System.out.println(ress.toString());

हालांकि यह कोड स्निपेट समाधान हो सकता है, स्पष्टीकरण सहित वास्तव में आपके पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जान सकते हैं।
नव एंडरसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.