2015-08-14 3 views
8

पर विचार करें इन दो वर्गोंक्या 2 नेस्टेड विकल्पों में लिपटे ऑब्जेक्ट को खोलने का कोई शानदार तरीका है?

class EmailService { 
    public Optional<String> getEmailAlias(String email); 
} 

enum Queue { 
    public static Optional<Queue> fromEmailAlias(String alias); 
} 

उपरोक्त विधियों के कार्यान्वयन सवाल का महत्वपूर्ण नहीं है तो मुझे लगता है कि सादगी के लिए बाहर छोड़ दिया है।

emailService.getEmailAlias("[email protected]") 
    .map(Queue::fromEmailAlias) 
    .ifPresent(queue -> { 
     // do something with the queue instance, oh wait it's an Optional<Queue> :(
    }); 

हालांकि, यह काम नहीं करता क्योंकि queue प्रकार Optional<queue> (एक ही प्रकार के रूप में Queue::fromEmailAlias द्वारा दिया) की है, इसलिए मैं इस बजाय:

मैं ऐसा करना चाहते हैं

emailService.getEmailAlias("[email protected]") 
    .map(Queue::fromEmailAlias) 
    .ifPresent(q-> { 
      q.ifPresent(queue -> { 
       // do something with the queue instance 
      } 
    }); 

बदसूरत imho की तरह।

public static Queue fromEmailAlias(String alias); 

को

public static Optional<Queue> fromEmailAlias(String alias); 

के हस्ताक्षर बदलने त्वरित सुधार है, लेकिन यह भी अन्य स्थानों पर जो Optional<Queue> की जरूरत है मेरी कोड पर असर पड़ेगा।

क्या इस नेस्टेड वैकल्पिक को खोलने का कोई अच्छा तरीका है?

उत्तर

13

आप flatMap लागू करने की आवश्यकता:

emailService.getEmailAlias("[email protected]") 
      .flatMap(Queue::fromEmailAlias) 
      .ifPresent(queue -> { 

      }); 
संबंधित मुद्दे

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