Необязательно Nullable Выполняет orElse, когда карта возвращает ноль - PullRequest
0 голосов
/ 22 декабря 2018

Я написал простой фрагмент

String aa = "aa";
String aaa = null;

String result = Optional.ofNullable(aa)
                        .map(s -> aaa)
                        .orElse("bb");

System.out.println(result);

orElse должен выполняться, когда aa равно нулю.Но он выполняется, когда map также возвращает ноль.

Насколько я понимаю, orElse будет выполнено только aa пусто.Но будет ли он выполнен, даже если карта вернет ноль?

Ответы [ 2 ]

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

Я должен не согласиться с принятым ответом, чтобы взглянуть на реализацию, здесь источником истины является только документация.И в вашем случае это довольно просто, вы делаете (что в основном соответствует null)

.map(s -> aaa)

И документ говорит:

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

В вашем случае результат применения операции map будет нулевым, поэтому часть В противном случае верните пустой необязательный , то есть результатorElse это то, что вы видите.

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

Насколько я понимаю, orElse будет выполняться только aa - null.Но будет ли он выполняться, даже если карта вернет ноль?

Это лучше объяснить реализацией самой функции Optional.map:

//         return type                 function to map
public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
    Objects.requireNonNull(mapper); // null check 
    if (!isPresent()) {
        return empty();    // could be true when 'aa' is null in your case
    } else {
        return Optional.ofNullable(mapper.apply(value)); // using Optional.ofNullable itself
    }
 }

Следовательноесли при применении mapper, т.е. в вашем случае s -> aaa возвращает null, операция map вернет Optional.empty с последующим orElse ветвлением.

...