2016-01-20 9 views
8

Così, dopo qualche lettura ho visto cheJava Opzionale - Se else

if (optional.isPresent()) { 
    //do smth 
} 

non è il modo migliore per utilizzare opzionale (http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html). Ma se ho una dichiarazione se-come questo:

if (optional.isPresent()) { 
    car = getCar(optional.get()); 
} else { 
    car = new Car(); 
    car.setName(carName); 
} 

E 'questo il modo migliore per farlo o c'è un modo più consigliato?

+0

Dubito che abbiate persino bisogno delle affermazioni if, questo tipo sfida l'intero punto. – Stultuske

+0

@assylias Come funziona? Il ritorno dell'opzionale sarebbe un ID e non un oggetto Auto? – uraza

+0

In realtà è stato introdotto un wrapper per indicare allo sviluppatore che ci può essere un'assenza di valore restituito da alcuni metodi e che dovrebbe prendere in considerazione. – Antoniossss

risposta

16

È possibile utilizzare Optional come segue.

Car car = optional.map(id -> getCar(id)) 
      .orElseGet(() -> { 
       Car c = new Car(); 
       c.setName(carName); 
       return c; 
      }); 

Scrivere con if-else affermazione è lo stile essenziale e richiede la variabile car da dichiarare prima if-else blocco.

L'utilizzo di map in Optional è uno stile più funzionale. E questo approccio non ha bisogno di una dichiarazione variabile in anticipo e si consiglia di utilizzare Optional.

+4

Sembra davvero funzionare. Tuttavia, mi chiedo se questo renda il codice più leggibile o se ci sia qualche vantaggio a scriverlo in questo modo. – uraza

+0

La scrittura in questo modo ometterà la necessità di dichiarare la variabile "Car car'. – TheKojuEffect

+0

@uraza Utilizzare if-else è uno stile imperativo e utilizzare questo approccio è uno stile funzionale. La leggibilità è aumentata in questo modo. – TheKojuEffect

3

Se è possibile incorporare il nome al costruttore Car, allora si può scrivere questo:

car = optional.map(id -> getCar(id)) 
       .orElseGet(() -> new Car(carName)); 

Se è necessario chiamare il setter separatamente dal costruttore, si finirebbe con qualcosa di simile:

car = optional.map(id -> getCar(id)) 
       .orElseGet(() -> { 
        Car c = new Car(); 
        c.setName(carName); 
        return c; 
       }); 
+1

orElseGet restituisce realmente un oggetto Car se l'opzione non è vuota? – uraza

+0

Se 'Car' ha un costruttore con parametro' carName', 'car = optional.orElse (nuova Car (carName));' potrebbe essere usato. – TheKojuEffect

+0

sembra, il 'Op' sta usando il metodo' getCar' per ottenere 'car' piuttosto che solo da' Optional'. – TheKojuEffect