2017-04-04 11 views
5
public ValueA map(ValueB valueB, Date date) { 
    Optional<ValueC> valueCOpt = find(valueB); 
    if (valueCOpt.isPresent()) { 
     ValueC valueC = valueCOpt.get(); 
     // call many getters on valueC and do a lot of logic with it. 
     return map(/*some parameters*/); 
    } 
    return null; 
} 

Dies scheint ziemlich hässlich. Der Vorteil von Optionals ist hier komplett verschwunden. Ich lese, dass man lieber map oder flatMap anstelle von get verwenden sollte. Aber ist es wirklich ein Vorteil, wenn ich jeden Getter wieWie vermeidet man die Verwendung von Optional.get und Optional.isPresent

valueC.getFieldA() 

mit

valueCOpt.map(ValueC::getFieldA) 

ersetzen Sie wissen einige gemeinsame oder Best Practices hier?

+3

https://www.youtube.com/watch?v=Ej0sss6cq14 – Eugene

Antwort

7

können Sie verwenden

public ValueA map(ValueB valueB, Date date) { 
    return find(valueB) 
     .map(valueC -> { 
      // call many getters on valueC and do a lot of logic with it. 
      return map(/*some parameters*/); 
     }) 
     .orElse(null); 
} 

der entscheidende Punkt ist, dass die Abbildungsfunktion nur ausgewertet, wenn die optionale nicht leer ist, andernfalls das Ergebnis bleibt eine leere optional . orElse(null) wird null zurückgeben, wenn das optionale leer ist.

+1

und wieder ... ziemlich schnell. – Eugene

+1

Das ist schön. Ein weiteres Refactoring wäre, nicht null, sondern ein leeres fakultativ zurückzugeben. Ich könnte dann schreiben: find (valueB) .map (valueC -> { // rufe viele getter auf valueC und mache eine Menge Logik damit. return map (/ * einige Parameter * /);}); Das heißt: Keine '.orElse (null)' benötigt. – Chris311

+0

@ Chris311 wenn 'map (/ * einige Parameter * /);})' gibt ein Optional zurück, dann können Sie stattdessen 'find (valueB) .flatMap (valueC -> map (...))' 'verwenden; –

3

Was Sie brauchen, ist auf der Karte, dann ein OrElse() oder orElseThrow(), wenn Sie eine Ausnahme benötigen

ValueA valueA = valueCOpt.map(valueC -> mapToValue(valueC)) 
     .orElse(null); 

OrElse() wird verwendet, wenn Sie einen Standardwert benötigen, in diesem Fall seine null

Verwandte Themen