2015-08-28 7 views
6

पर मैं java8 के अंदर बूलियन वैरिएबल को बदलने के लिए कोशिश कर रहा हूं, प्रत्येक लूप को सच है जो अंतिम नहीं है। लेकिन मुझे निम्न त्रुटि मिल रही है: एक संलग्न क्षेत्र में परिभाषित स्थानीय चर आवश्यक या अंतिम रूप से अंतिम होना चाहिए।जावा 8 प्रभावी रूप से अंतिम अंतिम संकलन समय त्रुटि गैर अंतिम चर

इस त्रुटि को हल करने के लिए कैसे करें?

कोड:

boolean required = false; 

यह चर मैं समारोह में बनाया गया है।

अब जब मैं इसे बदलने के लिए कोशिश कर रहा हूँ:

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

मैं त्रुटि हो रही है: स्थानीय चर एक संलग्न दायरे में परिभाषित की आवश्यकता अंतिम या प्रभावी ढंग से अंतिम होना चाहिए।

यह त्रुटि क्यों उत्पन्न हो रही है और इसे कैसे हल किया जाए?

उत्तर

6

आप स्थानीय चर को लैम्ब्डा अभिव्यक्ति के शरीर से नहीं बदल सकते हैं।

  • इस विशेष मामले तुम सिर्फ boolean required = !map.isEmpty(); किसी भी लैम्ब्डा अभिव्यक्ति के बिना सेट कर सकते हैं में: इस पर काबू पाने के कई तरीके हैं।

    boolean required = map.entrySet().stream().anyMatch(entry -> ...); 
    

    यह समाधान है सबसे पसंदीदा: आप इसे कुछ शर्त के आधार पर सेट करना चाहते हैं, तो आप स्ट्रीम एपीआई का उपयोग कर सकते हैं।

  • required परिवर्तनीय कक्षा के क्षेत्र में परिवर्तनीय रूपांतरित करें।

  • सबसे गंदा तरीका: एक एक तत्व सरणी की घोषणा: boolean[] required = {false}; और इसके बजाय इस तत्व सेट: required[0] = true;
+1

कुछ इस तरह: सबसे गंदा तरीका: एक एक तत्व सरणी की घोषणा: बूलियन [] की आवश्यकता = {असत्य}; और इसके बजाय इस तत्व को सेट करें: आवश्यक [0] = सत्य; मैं वास्तव में करना चाहता हूं लेकिन जैसा कि आपने कहा था कि यह गंदा दिखता है। स्थानीय चर बदलने के लिए कोई अन्य तरीका है lambda अभिव्यक्ति @tagirValeev –

+3

@ सिद्धार्थ, स्थानीय चर बदलने के लिए वास्तव में कोई रास्ता नहीं है। 'बुलियन [] आवश्यक' मामले में आप स्थानीय चर नहीं बदलते हैं, बल्कि इसके बजाय हीप ऑब्जेक्ट को बदलते हैं। –

+1

बस मेरे ज्ञान को बढ़ाने के लिए आप कृपया बता सकते हैं कि हेड ऑब्जेक्ट को बदलकर वास्तव में क्या मतलब है लेकिन स्थानीय चर बदलना। @tagirValeev –

संबंधित मुद्दे