Необязательный. Целесообразно и метод цепочки
Я был удивлен методом Optional.ofNullable
. В какой-то день я написал функцию, которая должна возвращать необязательный параметр:
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()
некоторое значение Integer или null. Нулевым может быть каждое из выражений: insight.getValues()
или insight.getValues().get(0)
.
Я знаю, что могу просто поместить это в блок try/catch, но мне интересно, есть ли более элегантное решение.
Ответы
Ответ 1
Если вы не знаете, что может быть null
, или хотите проверить все на null
, единственный способ - вызвать вызовы Optional.map
.
Если значение присутствует, примените к нему предоставленную функцию сопоставления, а если результат не равен нулю, верните опцию, описывающую результат. В противном случае верните пустой Необязательный.
Таким образом, если mapper возвращает null
, будет возвращен пустой Optional
, который позволяет связывать вызовы.
Optional.ofNullable(insight)
.map(i -> i.getValues())
.map(values -> values.get(0))
.map(v -> v.getValue())
.orElse(0);
Последний вызов orElse(0)
позволяет вернуть значение по умолчанию 0, если какой-либо возвращаемый mapper null
.
Ответ 2
smth, как это должно работать
Optional.ofNullable(insight.getValues()).map(vals -> vals.get(0)).map(v -> v.getValue())
хорошо, согласно приведенному образцу кода, поскольку #extractFirstValueFrom
не содержит ни @Nullable
, ни проверок для null, как Guava checkNotNull()
, допустим, что insight
всегда something
. поэтому обертка Optional.ofNullable(insight.getValues())
в Option
не приведет к NPE
. затем формируется цепочка цепочек преобразований (каждый результат с Optional
), которые приводят к результату Optional<Integer>
, который может быть либо Some
, либо None
.