Как это работает - Java 8 Optional.of и Optional.ofNullable - PullRequest
0 голосов
/ 12 ноября 2018

У меня вопрос с Java 8 Optionals.

Приведенный ниже код выдает ошибку компиляции:

Integer number = Optional.ofNullable(new Integer(10)); 

Но когда мы делаем следующее, оно не , я не понимаю, как это работает:

Integer number = Optional.ofNullable(new Integer(10)).orElse(10); 

Если мы посмотрим на документацию Optional.ofNullable(), он вернет объект типа static <T> Optional<T> ofNullable(T value), который означает, что это внутреннее приведение типа, но в документации сказано, что тип возвращаемого значения Optional ,

Я получаю, что тип возвращаемого метода .orElse равен T, который будет нормально работать , если переходит в состояние orElse, т. Е. В случае, если переданный объект равен null, но если это не null, как это типизирует это?

Ответы [ 4 ]

0 голосов
/ 10 декабря 2018

Я получаю, что тип возвращаемого значения метода .orElse - T, который будет работать нормально, если он переходит в условие orElse, т. Е. Если переданный объект равен нулю, но если он не равен нулю, как он типизирует его?

Optional.ofNullable () вернет дополнительный объект, который будет содержать фактическое значение, которое мы передали в качестве параметра, в переменную экземпляра с именем value.

orElse (T other) - Возвращает значение, если оно присутствует, в противном случае возвращает объект, переданный в качестве параметра.Внутренние компоненты метода orElse () в Java 8 Необязательный класс.

public T orElse(T other) {
   return value != null ? value : other;
}

orElse принимает параметр Generics, а приведение типа выполняется неявно.orElse вернет значение, если оно не равно нулю, в противном случае возвращает другое значение, которое было передано в качестве параметра.

0 голосов
/ 12 ноября 2018

Взгляните на объявление метода,

public static <T> Optional<T> ofNullable(T value)

Так что это берет T и возвращает Optional<T> Так что в вашем случае это берет Integer и возвращает Optional<Integer>

Итак, когда вы делаете это,

Optional.ofNullable(new Integer(10)).orElse(10);

Вызов orElse развернет необязательное значение и вернет в него значение, если оно не пустое. В противном случае он просто возвращает заданное значение.

Обновление

В соответствии со следующими комментариями вы можете еще больше упростить его, оставив задание на автобокс.

Optional.ofNullable(10).orElse(10);
0 голосов
/ 12 ноября 2018

Правильный способ сделать это будет

Optional<Integer> numberOpt = Optional.ofNullable(new Integer(10));
0 голосов
/ 12 ноября 2018
Integer number = Optional.ofNullable(new Integer(10));

С этим вы пытаетесь поставить Optional<Integer> на Integer. Что явно не разрешено.

Когда вы делаете

Integer number = Optional.ofNullable(new Integer(10)).orElse(10); 

С вами вы вызываете Optional<Integer>.orElse, и поскольку вы не используете Optional<Integer>.get, это возвращает Integer. Так что без ошибок.

...