Подтвердить что ты не робот

Необязательный. Целесообразно и метод цепочки

Я был удивлен методом 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, но мне интересно, есть ли более элегантное решение.

4b9b3361

Ответ 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.