Тип возвращаемого значения map
равен Optional <U>
, поэтому для получения реального значения необходимо вызвать orElse
с типом возврата T
.
Это реализация toString
.если Optional
:
@Override
public String toString() {
return value != null
? String.format("Optional[%s]", value)
: "Optional.empty";
}
Так, вызывая toString
, вы никогда не получите реальное значение, но значение, обернутое в Optional
, в то время как orElse
вернет вам значение по умолчанию.
Посмотрим на разницу:
Integer i = 4;
String s = Optional.ofNullable(i)
.map(Objects::toString)
.toString();
System.out.println(s);
Вывод:
Optional[4]
С null
:
Integer i = null;
String s = Optional.ofNullable(i)
.map(Objects::toString)
.toString();
System.out.println(s);
Вывод:
Optional.empty
При использовании orElse
:
Integer i = null;
String s = Optional.ofNullable(i)
.map(Objects::toString)
.orElse("None");
System.out.println(s);
Вывод:
None
Таким образом, вы можете видеть, что эти методы имеют разные цели.
И ответ на ваш комментарий:
" Есть ли способ вызвать get (), а также вызвать orElse () в той же цепочке? "
Integer i = 10;
String s = Optional.ofNullable(i)
.map(Objects::toString)
.orElse("None");
System.out.println(s);
Вывод:
10
Вам не нужно явно вызывать get
, значение будет извлечено, если не null
;
/**
* If a value is present, returns the value, otherwise returns
* {@code other}.
*
* @param other the value to be returned, if no value is present.
* May be {@code null}.
* @return the value, if present, otherwise {@code other}
*/
public T orElse(T other) {
return value != null ? value : other;
}