2016-01-20 3 views
8

Таким образом, после некоторого чтения я видел, чтоJava Дополнительно - Если Else отчетности

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

не является предпочтительным способом использования Факультативно (http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html). Но если у меня есть заявление, если-так:

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

Это лучший способ сделать это, или есть более рекомендуемый способ?

+0

Я сомневаюсь, что вам даже нужны утверждения if, это не соответствует целям. – Stultuske

+0

@assylias Как это работает? Возврат необязательного будет id, а не объектом Car? – uraza

+0

На самом деле это введенная оболочка, указывающая разработчику, что от некоторых методов может отсутствовать возвращаемое значение, и он должен принять дополнительное внимание. – Antoniossss

ответ

16

Вы можете использовать Optional следующим образом.

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

Записи с if-else заявления является обязательным стиль, и это требует переменной car быть объявлена ​​до if-else блока.

Использование map в Optional более функциональный стиль. И этот подход не требует объявления переменной заранее, и рекомендуется использовать Optional.

+4

Это действительно работает. Тем не менее, я действительно задаюсь вопросом, делает ли это код более удобочитаемым или если есть какое-либо преимущество в написании этого так. – uraza

+0

Написание этого способа не укажет на необходимость объявления переменной 'Car car'. – TheKojuEffect

+0

@uraza Использование if-else является императивным стилем, и использование этого подхода - функциональный стиль. Таким образом, читаемость увеличивается. – TheKojuEffect

3

Если вы можете включить имя в Car конструктор, то вы можете написать это:

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

Если вы должны вызвать сеттер отдельно от конструктора, вы бы в конечном итоге с чем-то вроде этого:

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

Действительно ли orElseGet возвращает объект Car, если необязательный параметр не пуст? – uraza

+0

Если 'Car' имеет конструктор с параметром' carName', 'car = optional.orElse (новый Car (carName)),' может использоваться. – TheKojuEffect

+0

похоже, что 'Op' использует метод' getCar' для получения 'car', а не только' Optional'. – TheKojuEffect

Смежные вопросы