2016-01-20 8 views
8

तो कुछ पढ़ने के बाद मैंने देखा है किजावा वैकल्पिक - वरना वक्तव्य तो

if (optional.isPresent()) { 
    //do smth 
} 

वैकल्पिक (http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html) का उपयोग करने के लिए पसंदीदा तरीका नहीं है। लेकिन अगर मेरे पास इस तरह का एक कथन है:

if (optional.isPresent()) { 
    car = getCar(optional.get()); 
} else { 
    car = new Car(); 
    car.setName(carName); 
} 

क्या यह करने का यह सबसे अच्छा तरीका है या कोई और अनुशंसित तरीका है?

+0

मुझे संदेह है कि आपको बयानों की भी आवश्यकता है, यह पूरे बिंदु को अस्वीकार करता है। – Stultuske

+0

@assylias यह कैसे काम करता है? वैकल्पिक की वापसी एक आईडी होगी, न कि कार वस्तु? – uraza

+0

दरअसल यह डेवलपर को इंगित करने के लिए पेश किया गया है कि कुछ तरीकों से लौटाए गए मूल्य की अनुपस्थिति हो सकती है और उसे अतिरिक्त विचार करना चाहिए। – Antoniossss

उत्तर

16

आप निम्नलिखित के रूप में Optional का उपयोग कर सकते हैं।

Car car = optional.map(id -> getCar(id)) 
      .orElseGet(() -> { 
       Car c = new Car(); 
       c.setName(carName); 
       return c; 
      }); 

if-else बयान के साथ लेखन जरूरी शैली है और यह आवश्यकता है चर carif-else ब्लॉक से पहले घोषित किया जाना है।

mapOptional का उपयोग करना अधिक कार्यात्मक शैली है। और इस दृष्टिकोण को पहले से ही परिवर्तनीय घोषणा की आवश्यकता नहीं है और Optional का उपयोग करने की अनुशंसा की जाती है।

+4

यह वास्तव में काम करता प्रतीत होता है। हालांकि, मुझे आश्चर्य है कि क्या कोड को और अधिक पठनीय बनाता है या यदि इसे इस तरह लिखने में कोई फायदा होता है। – uraza

+0

इस तरह से लिखने से 'कार कार' चर घोषित करने की आवश्यकता को छोड़ दिया जाएगा। – TheKojuEffect

+0

@uraza का उपयोग करना-और अनिवार्य शैली है और इस दृष्टिकोण का उपयोग कार्यात्मक शैली है। इस तरह की पठनीयता में वृद्धि हुई है। – TheKojuEffect

3

आप Car निर्माता में नाम शामिल कर सकते हैं, तो आप यह लिख सकते हैं:

car = optional.map(id -> getCar(id)) 
       .orElseGet(() -> new Car(carName)); 

आप अपने निर्माता से अलग सेटर कॉल करना होगा, तो आप इस तरह कुछ के साथ खत्म हो जाएगा:

car = optional.map(id -> getCar(id)) 
       .orElseGet(() -> { 
        Car c = new Car(); 
        c.setName(carName); 
        return c; 
       }); 
+1

वैकल्पिक विकल्प खाली नहीं होने पर ORElseGet वास्तव में एक कार ऑब्जेक्ट वापस करता है? – uraza

+0

यदि 'कार' में पैरामीटर 'कारनाम' के साथ एक कन्स्ट्रक्टर है, तो 'कार = वैकल्पिक.ऑर इलसे (नई कार (कारनाम));' का उपयोग किया जा सकता है। – TheKojuEffect

+0

ऐसा लगता है कि 'ओप' 'वैकल्पिक 'से सिर्फ' कार 'पाने के लिए' getCar' विधि का उपयोग कर रहा है। – TheKojuEffect

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