2017-04-04 33 views
5
public ValueA map(ValueB valueB, Date date) { 
    Optional<ValueC> valueCOpt = find(valueB); 
    if (valueCOpt.isPresent()) { 
     ValueC valueC = valueCOpt.get(); 
     // call many getters on valueC and do a lot of logic with it. 
     return map(/*some parameters*/); 
    } 
    return null; 
} 

का उपयोग करने से कैसे बचें यह काफी बदसूरत लगता है। विकल्प का लाभ पूरी तरह से यहां चला गया है। मैंने पढ़ा है कि get के बजाय map या flatMap का उपयोग करना चाहिए। लेकिन अगर मैं की जगहOptional.get और Optional.isPresent

valueCOpt.map(ValueC::getFieldA) 

साथ

valueC.getFieldA() 

की तरह हर गेटर आप कुछ सामान्य या सबसे अच्छा यहाँ प्रथाओं जानते हैं यह वास्तव में एक फायदा है?

+3

https://www.youtube.com/watch?v=Ej0sss6cq14 – Eugene

उत्तर

7

आप उपयोग कर सकते हैं

public ValueA map(ValueB valueB, Date date) { 
    return find(valueB) 
     .map(valueC -> { 
      // call many getters on valueC and do a lot of logic with it. 
      return map(/*some parameters*/); 
     }) 
     .orElse(null); 
} 

प्रमुख मुद्दा है कि मानचित्रण समारोह केवल मूल्यांकन किया जाता है, अगर वैकल्पिक खाली नहीं है, अन्यथा, परिणाम एक खाली वैकल्पिक रहता है । orElse(null) वैकल्पिक खाली होने पर null वापस करेगा।

+1

और फिर ... काफी तेज़। – Eugene

+1

यह अच्छा है। एक और रिफैक्टरिंग शून्य वापस नहीं बल्कि एक खाली वैकल्पिक होगा। मैं तब लिख सकता था: ढूंढें (valueB) .map (valueC -> { // मूल्य सी पर कई गेटर्स कॉल करें और इसके साथ बहुत सारे तर्क करें। वापसी मानचित्र (/ * कुछ पैरामीटर * /);}); वह है: नहीं '.orelse (शून्य)' की आवश्यकता है। – Chris311

+0

@ क्रिस 311 यदि 'नक्शा (/ * कुछ पैरामीटर * /);}) 'वैकल्पिक विकल्प लौटाएं तो आप' find (valueB) .flatMap (valueC -> map (...))' का उपयोग कर सकते हैं; –

3

आपको क्या करना होगा मैप करने के लिए है, तो एक orElse(), या orElseThrow() करता है, तो आप एक अपवाद

ValueA valueA = valueCOpt.map(valueC -> mapToValue(valueC)) 
     .orElse(null); 

orElse (आवश्यकता) प्रयोग किया जाता है जब आप एक डिफ़ॉल्ट मान की जरूरत है इस मामले में अपनी null में है

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