2015-08-31 14 views
7

जावा 8 Optional कक्षा प्रस्तुत करता है।यदि शून्य नहीं है - जावा 8 शैली

से पहले (जावा 7):

Order order = orderBean.getOrder(id); 
if (order != null) { 
    order.setStatus(true); 
    pm.persist(order); 
} else { 
    logger.warning("Order is null"); 
} 

तो जावा 8 शैली पर:

Optional<Order> optional = Optional.ofNullable(orderBean.getOrder(id)); 
optional.ifPresent(s -> { 
    s.setStatus(true); 
    pm.persist(s); 
    //Can we return from method in this place (not from lambda) ??? 
}); 
//So if return take place above, we can avoid if (!optional.isPresent) check 
if (!optional.isPresent) { 
    logger.warning("Order is null"); 
} 

यह इस मामले में Optional उपयोग करने के लिए सही है? क्या कोई जावा 8 शैली में एक और अधिक सुविधाजनक तरीका प्रस्तावित कर सकता है?

+0

यह अक्षम है, लेकिन क्लीनर तरीका है, आप विकल्प के अंदर वैकल्पिक तत्व को ब्लॉक कर सकते हैं और NoSuchElementException अपवाद को पकड़ सकते हैं। – piezol

उत्तर

6

दुर्भाग्यवश, ifPresentOrElse विधि आप will be added केवल जेडीके -9 में देख रहे हैं। वर्तमान में आप अपनी परियोजना में अपने स्वयं के स्थिर विधि लिख सकते हैं:

public static <T> void ifPresentOrElse(Optional<T> optional, 
     Consumer<? super T> action, Runnable emptyAction) { 
    if (optional.isPresent()) { 
     action.accept(optional.get()); 
    } else { 
     emptyAction.run(); 
    } 
} 

और इस तरह का उपयोग करें:

Optional<Order> optional = Optional.ofNullable(orderBean.getOrder(id)); 
ifPresentOrElse(optional, s -> { 
    s.setStatus(true); 
    pm.persist(s); 
},() -> logger.warning("Order is null")); 

में जावा-9 यह आसान होगा:

optional.ifPresentOrElse(s -> { 
    s.setStatus(true); 
    pm.persist(s); 
},() -> logger.warning("Order is null")); 
+0

यह केवल तभी सुधार होगा जब ओपी को हैंडलिंग तर्क के साथ फ़ंक्शन को पैरामीटर करना पड़े। जैसा कि है, उसका कोड सादे पुराने के लिए एकदम सही मैच है। –

+0

@ मार्कोटोपोलनिक, मुझे नहीं लगता कि मुझे यह समाधान पसंद है। असल में मुझे विकल्प पसंद नहीं हैं और शायद ही कभी उनका इस्तेमाल करें। इस कोड में मैं निश्चित रूप से उनसे बचूंगा। –

+0

अच्छा जवाब। 'वैकल्पिक' वर्ग = एक जटिल तरीके से लिखा आसान सामान। मुझे वास्तव में इस कक्षा का उपयोग करने का कोई कारण नहीं दिखता है, आपको इस "आधुनिक" तरीके से अपना कोड लिखने के लिए और अधिक अक्षर चाहिए ... – vojta

1

//Can we return from method in this plase (not from lambda) ???

लैम्ब्डास "गैर-स्थानीय रिटर्न" अर्थशास्त्र लागू नहीं करते हैं, इसलिए उत्तर नहीं है।

आम तौर पर, क्योंकि आपको उस मामले में साइड-इफेक्टिव कार्रवाई की आवश्यकता होती है जहां मूल्य मौजूद है और नहीं, कोड में एक शाखा बिंदु — आवश्यक है चाहे आप इसे कुछ फैंसी एपीआई में लपेटें या नहीं। इसके अलावा, एफपी आम तौर पर पारदर्शी पारदर्शी परिवर्तनों (यानी, शुद्ध कार्यों के चारों ओर बनाए गए कोड) में सुधार करने में मदद करता है, न कि साइड इफेक्ट्स, इसलिए आपको वैकल्पिक एपीआई के माध्यम से जाने से ज्यादा लाभ नहीं मिलेगा।

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