2017-01-05 24 views
5

मैं कुछ इस तरह बनाने के लिए कोशिश कर रहा हूँ:,जावा 8 वैकल्पिक: ifPresent वापसी वस्तु orElseThrow अपवाद

private String getStringIfObjectIsPresent(Optional<Object> object){ 
     object.ifPresent(() ->{ 
      String result = "result"; 
      //some logic with result and return it 
      return result; 
     }).orElseThrow(MyCustomException::new); 
    } 

यह काम नहीं करेगा क्योंकि ifPresent पैरामीटर, शून्य स्वीकार है जो के रूप में उपभोक्ता कार्यात्मक इंटरफ़ेस लेता है (टी टी)। यह कोई मूल्य वापस नहीं कर सकता है। क्या ऐसा करने का कोई और तरीका है?

+0

संभावित डुप्लिकेट [Optional.ifPresent के समुचित उपयोग()] (http://stackoverflow.com/questions/24228279/proper-usage-of-optional-ifpresent) –

उत्तर

7

मुझे यकीन है कि मूल्य है करने के बाद मानचित्रण पसंद करते हैं उपलब्ध

private String getStringIfObjectIsPresent(Optional<Object> object) { 
    Object ob = object.orElseThrow(MyCustomException::new); 
    // do your mapping with ob 
    String result = your-map-function(ob); 
    return result; 
} 

या एक लाइनर

private String getStringIfObjectIsPresent(Optional<Object> object) { 
    return your-map-function(object.orElseThrow(MyCustomException::new)); 
} 
की
+0

असल में 'वैकल्पिक। Map' जांचता है कि पास मैपिंग फ़ंक्शन को कॉल करने से पहले ऑब्जेक्ट उपलब्ध है या नहीं। लेकिन कम से कम आप इस स्थिति को 1 शर्त ('value! = Null') छोड़ दें। – Roland

4

इसके बजाय map -Function का उपयोग करें। यह वैकल्पिक के अंदर मूल्य बदलता है।

इस तरह

:

private String getStringIfObjectIsPresent(Optional<Object> object) { 
    return object.map(() -> { 
     String result = "result"; 
     //some logic with result and return it 
     return result; 
    }).orElseThrow(MyCustomException::new); 
} 
11

वास्तव में क्या आप खोज रहे हैं है: Optional.map। आपका कोड तो देखो की तरह होगा:

object.map(o -> "result" /* or your function */) 
     .orElseThrow(MyCustomException::new); 

मैं नहीं बल्कि यदि आप कर सकते हैं Optional गुजर छोड़ जाएगा। अंत में आप यहां Optional का उपयोग करके कुछ भी हासिल नहीं करते हैं। एक थोड़ा अन्य संस्करण:

public String getString(Object yourObject) { 
    if (Objects.isNull(yourObject)) { // or use requireNonNull instead if NullPointerException suffices 
    throw new MyCustomException(); 
    } 
    String result = ... 
    // your string mapping function 
    return result; 
} 

आप पहले से ही एक और कॉल की वजह से Optional -object है, तो मैं अभी भी आप map -method उपयोग करने के लिए, एक कारण के लिए सिफारिश करेंगे isPresent, आदि के बजाय, कि मैं इसे और अधिक पठनीय (स्पष्ट रूप से एक व्यक्तिपरक निर्णय ;-)) ढूंढें।

2

दो यहाँ विकल्प:

बदलें map साथ ifPresent और प्रयोग FunctionConsumer के बजाय

private String getStringIfObjectIsPresent(Optional<Object> object) { 
    return object 
      .map(obj -> { 
       String result = "result"; 
       //some logic with result and return it 
       return result; 
      }) 
      .orElseThrow(MyCustomException::new); 
} 

उपयोग isPresent:

private String getStringIfObjectIsPresent(Optional<Object> object) { 
    if (object.isPresent()) { 
     String result = "result"; 
     //some logic with result and return it 
     return result; 
    } else { 
     throw new MyCustomException(); 
    } 
} 
संबंधित मुद्दे