метод get возвращает No_Value по желанию - PullRequest
0 голосов
/ 09 декабря 2018

В приведенном ниже примере изначально this.mMyBoundServiceHandlerThread имеет значение null.я хочу инициализировать этот объект, как показано в коде, размещенном ниже.

при выполнении кода я получаю следующее:

java.util.NoSuchElementException: No value present

, пожалуйста, дайте мне знать, почему .get () вернуть пустое значение?

код :

Optional<MyBoundServiceHandlerThread> s = Optionals.toOptional(this.mMyBoundServiceHandlerThread);
    s
            .map(x -> new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this))
            .orElse(new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this));
    s.get().start();

Ответы [ 2 ]

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

Не могли бы вы сообщить мне, почему .get () возвращает пустое значение?

В этом случае будет возвращаться только пустое значение Необязательно, если и только если this.mMyBoundServiceHandlerThread равно null следовательно, возвращаемый необязательный параметр имеет состояние отсутствия и при вызове .get() для пустого необязательного параметра он выдаст «Отсутствует значение», так как необязательный элемент имеет отсутствующее состояние (значение отсутствует).

, если вы уверены, что возвращаемый Optional не должен быть пустым, вам нужно будет отладить и отследить идентификатор mMyBoundServiceHandlerThread в вашей программе.

С другой стороны, Optional не должениспользовать вместо «if», я говорю это потому, что в настоящее время вы игнорируете элемент из map, идентифицированный как x, поэтому вам может быть лучше рефакторинг на:

MyBoundServiceHandlerThread result = null;
if(this.mMyBoundServiceHandlerThread != null) 
    result = new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this)

Такжеобратите внимание, что ваше альтернативное значение, указанное в orElse, совпадает с значением, переданным методу map, что выглядит необычно.Возможно, вы захотите разобраться в этом, если вы собираетесь продолжить использование Дополнительного.

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

Это должно быть:

s.map(x -> new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this))
 .orElse(new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this))
 .start();

s может быть пустым Optional, поэтому вызов s.get() может вызвать исключение.

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

PS Я не уверен, что вы *Вызовы 1013 * и orElse имеют смысл, поскольку ваш map игнорирует значение Optional.Вы можете заменить весь этот фрагмент кода следующим эквивалентным утверждением:

new MyBoundServiceHandlerThread(HANDLER_THREAD_MyBoundServiceForJob02, MyBoundServiceForJob02.this).start();

Не думаю, что это то, что вы хотели.

...