2016-10-19 2 views
1

Es ist eine Methode, die „someObj“ und ihr Zweck ist es zu überprüfen, den var AStellen vom Typ Set <>, durchlaufen sie und ersetzte ihre Objekte mit dem Datenbankobjekt empfängt. Dafür habe ich den folgenden Code geschrieben:Java 8 Optional/Funktionscodeoptimierung

if(!CollectionUtils.isEmpty(someObj.getASet())){ 
     someObj.setASet(
      someObj.getASet() 
        .stream() 
        .map(c -> AService.getExistingA(c.getId())) 
        .collect(Collectors.toSet()) 
     ); 
    } 

Es macht den Zweck, aber ich bin nicht wirklich zufrieden damit die Lesbarkeit ist.

Optional.ofNullable(someObj.getASet()) 
      .ifPresent(ASet-> someObj.setASet(
               ASet.stream() 
               .map(c -> AService.getExistingA(c.getId())) 
               .collect(Collectors.toSet()) 
      )); 

Jetzt sieht es noch weniger lesbar aus, können Sie einen besseren Weg empfehlen? Ich denke, das größte Problem ist, dass someObj.setASet, es ist einfach seltsam aussieht, ist ther jede funktionelle Weise das Objekt nach dem Sammeln zu ersetzen?

Antwort

6

Versuchen Optional.map mit:

Optional.ofNullable(someObj.getASet()) 
     .map(set -> set.stream() 
         .map(c -> AService.getExistingA(c.getId())) 
         .collect(Collectors.toSet())) 
     .ifPresent(set -> someObj.setASet(set)); 

Nun ist die Transformationslogik und den bedingten Imperativs „gesetzt das Ergebnis“ getrennt sind.

Oder die alte Standby funktioniert auch - keine Schande, es sich mit:

Set set = someObj.getASet(); 
if (set != null) { 
    Set newSet = set.stream() 
        .map(c -> AService.getExistingA(c.getId())) 
        .collect(Collectors.toSet()); 
    someObj.setASet(newSet); 
} 
+0

In meinem Kopf, die ich gelesen so nur die Dokumentation brechen würde auf der Karte innerhalb optional: Wenn ein Wert vorhanden ist, gelten die bereitgestellte Zuordnungsfunktion, und wenn das Ergebnis nicht null ist, gebe ein Optional zurück, das das Ergebnis beschreibt. Andernfalls geben Sie ein leeres Optional zurück. Ich liebe es, großer thx – Als

+3

immer gut, um die Dokumentation zu lesen .... –

+3

Aber eine viel bessere Alternative ist, das API-Design zu beheben. Wenn 'getASet()' niemals 'null' zurückgibt, sondern nur eine leere Menge, wird die gesamte' Optional'/Bedingungslogik unnötig. – Holger