2016-01-20 15 views
8

Więc po pewnym czytania Widziałem żeJava Opcjonalnie - Jeśli else

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

nie jest preferowanym sposobem używania opcjonalne (http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html). Ale jeśli mam instrukcję if tak:

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

Czy jest to najlepszy sposób, aby to zrobić, czy jest bardziej zalecany sposób?

+0

Wątpię, czy potrzebujesz nawet instrukcji if, to w pewnym sensie odrzuca cały punkt. – Stultuske

+0

@assylias Jak to działa? Zwrot opcji opcjonalnej byłby identyfikatorem, a nie obiektem Car? – uraza

+0

W rzeczywistości jest to wrapper wprowadzony, aby wskazać deweloperowi, że może istnieć absencja zwracanej wartości z niektórych metod i powinien on wziąć pod uwagę. – Antoniossss

Odpowiedz

16

Możesz użyć Optional jak poniżej.

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

Pisanie if-else oświadczenia jest imperatyw styl i wymaga zmienna car być zadeklarowane przed if-else bloku.

Używanie map w Optional jest bardziej funkcjonalnym stylem. To podejście nie wymaga uprzedniej deklaracji zmiennej i jest zalecanym sposobem używania Optional.

+4

To naprawdę działa. Zastanawiam się jednak, czy to sprawia, że ​​kod jest bardziej czytelny, czy też jest jakaś zaleta w pisaniu tego w ten sposób. – uraza

+0

Pisanie w ten sposób pominie konieczność zadeklarowania zmiennej 'Car car'. – TheKojuEffect

+0

@uraza Używanie if-else jest imperatywnym stylem i używanie tego podejścia jest stylem funkcjonalnym. Czytelność jest zwiększana w ten sposób. – TheKojuEffect

3

Jeśli można zawierać nazwę do konstruktora Car, można napisać to:

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

Jeśli musisz wywołać setter oddzielnie od konstruktora, by skończyć z czymś takim:

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

Czy orElseGet naprawdę zwraca obiekt Car, jeśli opcja nie jest pusta? – uraza

+0

Jeśli 'Car' ma konstruktor z parametrem' carName', można użyć 'car = optional.orElse (new Car (carName));'. – TheKojuEffect

+0

Wygląda na to, że 'Op' używa metody' getCar', aby pobrać 'car' zamiast tylko z' Opcjonalnie'. – TheKojuEffect