2017-01-20 7 views
4

Ich habe den folgenden Code derzeit.Java 8 Stream - Bezug auf Original-Stream-Objekt nach Flatmap

Method - parseGreeting()

public GetGreetingNmsObjects parseGreeting(String greetingType, GetGreetingNmsResponse xmlFromNms) { 

    GetGreetingNmsObjects objectFound = null; 
    List<GetGreetingNmsObjects> objList = xmlFromNms.getObject(); 
    for (GetGreetingNmsObjects obj : objList) { 

     List<Attribute> attrs = obj.getAttributes(); 
     Optional<Boolean> found = attrs.stream() 
           .filter(a -> a.name.equals(GREETING_TYPE)) 
           .map(a -> a.value.equals(greetingType)) 
           .findAny(); 

     if(found.get()) { 
      objectFound = obj; 
      break; 
     } 

    return objectFound; 
} 

GetGreetingNmsObjects .java-

public class GetGreetingNmsObjects { 
    List<Attribute> attributeList; 

    public List<Attribute> getAttributes() { 
     return attributeList; 
    } 
} 

In dem obigen Verfahren ist es eine Möglichkeit, die für die Schleife und if-Anweisung zu vermeiden und handle mit Streams selbst?

Ich habe versucht, 'flatmap' zu verwenden und den Stream für 'attributesList' abrufen, aber sobald die Übereinstimmung gefunden wird, konnte ich keinen Verweis auf 'GetGreetingNmsObjects' Objekt abrufen.

GetGreetingNmsObjects objectFound = objList.stream() 
            .flatMap(grt -> grt.getAttributes()) 
            .filter(a -> a.name.equals(GREETING_TYPE)) 
            .map(a -> a.value.equals(greetingType)) 
            ???? 

Antwort

11

Ihr Original-Code enthält einen Logikfehler:

Optional<Boolean> found = … 
         .map(a -> a.value.equals(greetingType)) 
         .findAny(); 

Dies wird das Ergebnis eines willkürlichen Vergleich zurückzukehren, in einem sequentiellen Kontext, es ist wahrscheinlich das Ergebnis des ersten Elements.

Ich bin mir ziemlich sicher, dass Sie wirklich wissen wollen, ob es ein passendes Element ist, sollte daher kann einfach als Prädikat Dieser

boolean found = … 
       .anyMatch(a -> a.value.equals(greetingType)); 

verwenden wird verwendet, um das erste Element finden Sie das passende Element:

return xmlFromNms.getObject().stream() 
    .filter(obj -> obj.getAttributes().stream() 
         .filter( a -> a.name.equals(GREETING_TYPE)) 
         .anyMatch(a -> a.value.equals(greetingType))) 
    .findFirst().orElse(null);