2015-08-28 6 views
40

मै मैप एंट्री सेट के लिए प्रत्येक लूप के लिए जावा 7 से जावा 8 तक प्रत्येक लूप के लिए पुराना पारंपरिक रूपांतरित करने की कोशिश कर रहा हूं लेकिन मुझे एक त्रुटि मिल रही है। कोड यह मैं कन्वर्ट करने के लिए कोशिश कर रहा हूँ:मानचित्र प्रविष्टि सेट के लिए प्रत्येक लूप जावा 8

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)

उत्तर

103

के हस्ताक्षर से मेल नहीं खाता पढ़ें the javadoc: 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()); 
}); 
+0

ग्रेट के लिए निम्नलिखित कोड का उपयोग कर सकते हैं। अब दोनों काम कर रहे हैं। लेकिन कौन सा बेहतर तरीका है? किस मामले में प्रदर्शन बेहतर होगा? @JBNizet –

+2

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

+0

धन्यवाद @MarkoTopolnik मुझे आपका अंक मिला। –

8

शायद "कौन सा संस्करण तेज है और मैं किस का उपयोग करूंगा" जैसे सवालों के जवाब देने का सबसे अच्छा तरीका है? । स्रोत कोड के लिए देखने के लिए है: - 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); 
    } 
} 

javadoc

map.entrySet() foreach() से -

map.forEach() Iterable से जावा

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

javadoc

यह तुरंत पता चलता है कि map.forEach() भी मानचित्र का उपयोग कर रहा है। आंतरिक आंतरिक रूप से। तो मानचित्र का उपयोग करने में मुझे कोई प्रदर्शन लाभ की उम्मीद नहीं होगी। map.entrySet() .Each() पर 0 ()। तो आपके मामले में उत्तर वास्तव में आपके व्यक्तिगत स्वाद पर निर्भर करता है :)

अंतर की पूरी सूची के लिए कृपया प्रदान किए गए जावाड लिंक देखें। हैप्पी कोडिंग!

4

आप आपकी आवश्यकता

map.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v)); 
संबंधित मुद्दे