2016-02-11 2 views
14

Я был удивлен Optional.ofNullable метод. Однажды я написал функцию, которая должна возвращать Факультативно:Optional.ofNullable и метод chaining

private Optional<Integer> extractFirstValueFrom(InsightsResponse insight) { 
    return Optional.ofNullable(insight.getValues().get(0).getValue()); 
} 

Я ошибочно полагал, что Optional.ofNullable предотвратит NullPointerExceptions внутри выражения аргумента.

Теперь я думаю, что знаю, что это была очень глупая идея. Java должен сначала разрешить аргументы, чтобы передать его вызову Optional.ofNullable.

У меня есть вопрос. Есть ли хороший и хороший способ достичь моей цели? Я хотел бы получить из выражения insight.getValues().get(0).getValue() некоторое целочисленное значение или null. Нулевым может быть каждое из выражений: insight.getValues() или insight.getValues().get(0).

Я знаю, что могу просто положить это в блок try/catch, но мне интересно, есть ли более элегантное решение.

+0

В вашем случае 'insight' имеет значение null. Гораздо лучше никогда не передавать значение null методам, а не проверять нулевые внутри методы. –

ответ

20

Если вы понятия не имеете, что может быть null, или вы хотите, чтобы проверить все для null, единственный путь к цепи вызовов Optional.map:

Если значение присутствует, применяется при условии функцию отображения для он, и если результат не равен нулю, верните опцию, описывающую результат. В противном случае возвратите пустой Необязательный.

Таким образом, если картографа возвращение null, пустой Optional будет возвращен, который позволяет цепи вызовов.

Optional.ofNullable(insight) 
     .map(i -> i.getValues()) 
     .map(values -> values.get(0)) 
     .map(v -> v.getValue()) 
     .orElse(0); 

Окончательный вызов orElse(0) позволяет вернуть значение по умолчанию 0, если какой-либо блок отображения вернулся null.

2

-л, как это должно работать

Optional.ofNullable(insight.getValues()).map(vals -> vals.get(0)).map(v -> v.getValue()) 

хорошо, в соответствии с образцом кода дают, как #extractFirstValueFrom не содержат ни @Nullable, ни проверки на нуль, как гуава-х checkNotNull(), давайте предположим, что insight всегда something. таким образом, упаковка Optional.ofNullable(insight.getValues()) в Option не будет иметь результатом NPE. затем формируется цепочка цепочек преобразований (каждый результат равен Optional), которые приводят к результату Optional<Integer>, который может быть либо Some, либо None.

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