2015-08-14 8 views
8

Rozważmy te dwie klasyCzy istnieje elegancki sposób na rozwinięcie obiektu zawiniętego w 2 zagnieżdżone opcje?

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

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

Realizacja powyższych metod nie jest ważne na pytanie tak mi zostało, że dla uproszczenia.

chcę to zrobić:

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

Jednak to nie działa, ponieważ queue jest typu Optional<queue> (tego samego typu zwracanego przez Queue::fromEmailAlias), więc muszę to zamiast:

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

Rodzaj brzydkiego imho.

Zmiana podpisu

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

do

public static Queue fromEmailAlias(String alias); 

to szybko naprawić, ale to również wpływ mojego kodu w innych miejscach, które wymagają Optional<Queue>.

Czy istnieje dobry sposób na rozwinięcie tego zagnieżdżonego Opcjonalnie?

Odpowiedz

13

Trzeba zastosować flatMap:

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

      });