java - How to use IntelliJ's Evaluate Expression tool with lambdas and outer scopes? -


यहां एक सरल जावा 8 लैम्ब्डा उदाहरण है।

  सार्वजनिक वर्ग मुख्य {सार्वजनिक स्थिर शून्य} मुख्य (स्ट्रिंग [] आर्ग्स) {स्ट्रिंग बाहरी सर्स्कोप = "बाहरी"; रननाबल रननबल = नया रननाबल () {@ ओवरराइड पब्लिक वायड रन () {स्ट्रिंग रननएबलइनर = "रननेबल इनर"; System.out.println ("रननबल के अंदर:" + बाहरी स्कस्को); शून्य से बचें = नल; // ब्रेकपॉइंट}}; रननेबल लैम्ब्डा = () - & gt; {स्ट्रिंग लैम्ब्डाइनर = "लैम्ब्डा इनर"; System.out.println ("अंदर लैम्ब्डा:" + बाहरी स्कस्को); शून्य से बचें = नल; // ब्रेकपॉइंट}; runnable.run (); lambda.run (); }}  

रननेबल के अंदर की जांच करने के लिए IntelliJ का "मूल्यांकन मूल्यांकन" उपकरण का उपयोग करना संभव है कि बाहरी स्कोप परिभाषित किया गया है

हालांकि, लैम्ब्डा गुंजाइश बाहरी स्कोप के अंदर अनिर्धारित है।

दोनों प्रिंट स्टेटमेंट को सही ढंग से आउटर्सस्कॉप के मान को प्रिंट करें।

क्या यह तय करने का कोई तरीका है?

लम्बेडा एक्सप्रेशंस को मालिक वर्ग के भीतर सिंथेटिक विधियों में संकलित किया जाता है। जब मैं अपने क्लास के साथ javap-personal -l चलाता हूँ, तो यह विधि इस रूप में छपी हुई है:

  निजी स्थिर शून्य लैम्ब्डा $ मुख्य $ 0 (java.lang.String); लाइननम्बरटैबल: लाइन 18: 0 लाइन 1 9: 3 पंक्ति 20: 28 लाइन 21: 30 लोकलवेरियबलटैबल: लैटिन स्लॉट नाम हस्ताक्षर प्रारंभ 3 28 1 लैंबडाइन्नेर लाजावा / लैंग / स्ट्रिंग; 30 1 2 लाजावा / लैंग / शून्य से बचें;  

आप यहां क्या देख सकते हैं, यह है कि इस पद्धति में एक पैरामीटर है जो outerScope चर के लिए वास्तविक कैप्ड मान प्राप्त करेगा। लेकिन स्थानीय वैरिएबलटेबल इसके लिए एक नाम नहीं घोषित करता है जो सबसे अधिक संभावना है कि डिबगर अपने रनटाइम मान को नहीं दिखाता है।

विडंबना यह है कि अगर हम लोकलवेरिएबलटेबल विशेषता, हम वांछित मान देखेंगे। जैसे -g: लाइनों के साथ कंपाइल करते समय और लैम्ब्डा अभिव्यक्ति बॉडी के भीतर एक ब्रेकपॉइंट पर रोकते हुए, नेटबीन्स डीबगर दिखाता है:

  args String " बाहरी "व्हेरिएबल जानकारी उपलब्ध नहीं है, बिना-जी विकल्प के संकलित स्रोत  

तो हमें पता है कि विधि के भीतर घोषित अन्य स्थानीय चर को देखने की कीमत पर पैरामीटर के रूप में पारित किए गए सभी मान।


तो क्या आवश्यक है, एक स्थानीय वैरिएबलटेबल विशेषता है जिसमें कब्जा किए गए मानों के लिए बाह्य क्षेत्र के चर नामों के नाम शामिल हैं, एक मुद्दा जो javac होगा।

यदि आप प्रतीक्षा नहीं कर सकते हैं और लोकलवेरिएबलटेबल विशेषता को पैचिंग करने के लिए एक उपकरण लिखना नहीं चाहते हैं तो आप यह मान सकते हैं कि कॉलर सिंथेटिक विधि की पैरामीटर मानों को जानता है इसलिए यदि आप स्टैक ट्रेस में रनटाइम जेनरेटेड लैम्ब्डा इंस्टेंस पर एक कदम ऊपर जाते हैं, तो आप सभी कैप्चर किए मूल्यों को इंस्टेंस वैरिएबल के रूप में देखेंगे, हालांकि वे arg $ 1 आदि जैसे नाम उत्पन्न करेंगे।

< / div>

Comments

Popular posts from this blog

python - Overriding the save method in Django ModelForm -

html - CSS autoheight, but fit content to height of div -

qt - How to prevent QAudioInput from automatically boosting the master volume to 100%? -