2017-10-11 4 views
2

je peux extraire une section particulière en utilisant Java8 comme ci-dessousUtilisation de Java Optional.ofNullable efficacement

request.getBody() 
     .getSections() 
     .filter(section -> "name".equals(section.getName)) 
     .findFirst(); 

Mais comment dois-je faire la même chose en utilisant en option dans une seule ligne . Je pourrais avoir le corps ou les sections nulles.

J'ai essayé le ci-dessous, mais ne fonctionne pas

Optional.ofNullable(request) 
     .map(Request::getBody) 
     .map(Body::getSections) 
     .filter(section -> "name".equals(section.getName)) //compliation error. section is coming as a list here 
     .findFirst(); 

Je ne suis pas en mesure d'obtenir ce travail en une seule ligne. J'ai essayé de faire flatmap mais je ne travaillais pas aussi bien. S'il vous plaît aviser si nous pouvons y parvenir dans une ligne unique.

est Ci-dessous le schéma complet pour référence

class Request { 
    Body body; 

    public Body getBody() { 
     return body; 
    } 

    public void setBody(Body body) { 
     this.body = body; 
    } 

} 

class Body { 
    List<Section> sections; 

    public List<Section> getSections() { 
     return sections; 
    } 

    public void setSections(List<Section> sections) { 
     this.sections = sections; 
    } 

} 

class Section { 
    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 
+1

Remplacer '.filter (section -> "name" .equals (section.getName)). findFirst(); 'avec' .flatMap (sections -> sections.stream() .filter (section -> "nom" .equals (section.getName ())). findFirst()); ' – Holger

Répondre

5

Vous devez convertir Optional ce qui représente une valeur unique, à un Stream pour terminer les opérations filter et findFirst(). Au moins une façon est de la carte à un Stream vide (ou vide List comme dans la réponse voisine) en cas de nulls:

Optional.ofNullable(request) 
    .map(Request::getBody) 
    .map(Body::getSections) 
    .map(List::stream) 
    .orElse(Stream.empty()) 
    .filter(section -> "name".equals(section.getName)) 
    .findFirst(); 
+0

Maintenant, je comprends. Merci beaucoup. – druid1123

2

Cela devrait fonctionner pour vous:

Optional.ofNullable(request) 
    .map(Request::getBody) 
    .map(Body::getSections) 
    .orElse(Collections.emptyList()) 
    .stream() 
    .filter(section -> "name".equals(section.getName)) 
    .findFirst();