2014-05-25 9 views
9

कहें कि मेरे पास एक इंटीजर सूची है और मैं अपने मूल्यों को दोगुना करने के लिए सूची में प्रत्येक विधि के लिए जावा 8 का उपयोग कर रहा हूं।प्रत्येक जावा को संशोधित नहीं करता है (8) संग्रह

List<Integer> l = Arrays.asList(2,3,6,1,9); 
l.forEach(p->p*=2); 

foreach विधि के रूप में उपभोक्ता लेते हैं और इसे methos स्वीकार कॉल: मैं निम्नलिखित कोड है कहो। मैं उपरोक्त कोड को चलाने के बाद सूची मुद्रित करता हूं और मूल सूची नहीं बदली जाती है।

जहां तक ​​मैं समझता हूँ स्ट्रीम स्रोत में परिवर्तन नहीं करता, लेकिन यहाँ मैं सिर्फ प्रत्येक तत्व पर विधि स्वीकार ...

mapforEach के insted उपयोग करने के लिए परिवर्तन करने के लिए advace में यू धन्यवाद

उत्तर

13

कारण यह है कि foreach सूची उत्परिवर्तित नहीं है विनिर्देश करने के लिए नीचे आता है:

forEach के लिए जावाडोक का कहना है:

default void forEach(Consumer<? super T> action)

..... डिफ़ॉल्ट कार्यान्वयन इस तरह व्यवहार करता है:

 for (T t : this) 
     action.accept(t); 

आप देख सकते हैं:

  • action एक Consumer है; यानी यह एक मूल्य उत्पन्न नहीं करता है।
  • अर्थशास्त्र this संग्रह को अद्यतन करने की अनुमति नहीं देते हैं।
+0

आपके उत्तर के लिए धन्यवाद। लेकिन अगर टी कुछ वस्तु संदर्भ है और मैं अपनी सामग्री को प्रत्येक लूप के भीतर बदलता हूं तो मुझे अपनी नई सामग्री देखना चाहिए। – user1409534

+2

नहीं, यह लैम्बडा के साथ या बिना सच नहीं है, और कभी नहीं किया गया है। –

+0

@ user1409534 - आप ऑब्जेक्ट संदर्भ बिंदु को ऑब्जेक्ट की सामग्री बदल सकते हैं, लेकिन यह सूची को अद्यतन नहीं करता है। सूची को अपडेट करने के लिए (जिस तरह से आप करने का प्रयास कर रहे हैं), आपको ऑब्जेक्ट संदर्भ को किसी अन्य सूची में प्रतिस्थापित करना होगा। आप इसे 'forEach() 'के साथ नहीं कर सकते हैं। और निश्चित रूप से लैम्ब्डा इसे नहीं कर सकता/नहीं कर सकता। –

6

प्रयास करें फोन मूल List

List<Integer> list = Arrays.asList(2,3,6,1,9); 
list=list.stream().map(p -> p * 2).collect(Collectors.toList()); 
System.out.println(list); 
+8

कि एक नई सूची बनाता है, ऐसा नहीं मौजूदा सूची को म्यूट नहीं करते हैं। यह शायद इस तरह से बेहतर है, लेकिन भेदभाव से अवगत होना अभी भी महत्वपूर्ण है। –

+0

आपके उत्तर के लिए धन्यवाद। मैं नए संग्रह और स्ट्रीम के मानचित्र मेटोड प्राप्त करने के लिए मानचित्र का उपयोग करने के बारे में जानता हूं। मुझे समझ में नहीं आता है कि संग्रह पर प्रत्येक मेटोड तत्व को क्यों नहीं बदलता है अगर इसका एकमात्र कॉलिंग दिए गए लैम्ब्डा के मेटोड को स्वीकार करता है? – user1409534

18

विधि forEach केवल उसमें बदलाव करने के लिए, आप तत्वों को बदलना चाहते हैं, तो आप विधि replaceAll उपयोग कर सकते हैं बिना सूची के तत्वों के माध्यम से दोहराता:

List<Integer> l = Arrays.asList(2,3,6,1,9); 
l.replaceAll(p->p*2); 
संबंधित मुद्दे