2017-02-16 17 views
3

Я недавно видел blog post (tweeted by @java), что указывает на следующий код становится все более распространенным:Optional.ofNullable (я) .ifPresent ... против, если (я! = NULL)

Optional.ofNullable(i).ifPresent(x -> doBlah(x)); 

вместо из:

if (i != null) { 
    doBlah(i); 
} 

использование Дополнительно в этом случае оказывается очень неудобно для меня, даже не обращая внимания на именование переменных - последний легче читать и более идиоматических для случая использования (обработки аннулирует). Я считаю, что это также улучшает семантику лучше - я, скорее всего, из кода, который не придерживается семантики, которую Опция пытается захватить (как описано в possible duplicate и в this Oracle article).

Я не вижу одного, но есть ли хорошая семантическая причина, чтобы предпочесть Необязательный. Необязательный подход (игнорируя влияние производительности, которое может иметь в зависимости от того, как оно используется)?

+1

'orElse (x-> doBla (x))' неверно, если только 'i' не является лямбдой. – shmosel

+1

http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html – shmosel

+1

http://stackoverflow.com/documentation/java/152/optional – shmosel

ответ

8

Для одного и того же блока кода не имеет смысла обертывать потенциально нулевой объект в необязательном порядке только для вызова ifPresent().

Более полезный случай для API, который может возвращать нулевые объекты, вместо этого возвращать необязательный. Это заставляет вызывающего пользователя обрабатывать потенциальные нулевые результаты нулевым образом. Поскольку API и вызывающий являются отдельными единицами кода, дополнительная работа по обертыванию объекта в Необязательном и принуждение вызывающего абонента к вызову ifPresent() не просто занята работой, но фактически обеспечивает более безопасный контракт, который защищает от исключений с нулевым указателем.

+3

Да, действительно, это способ «Необязательный» был разработан для использования: как возвращаемое значение. – erickson