getNullPoJo().orElse(getDefaultPoJo());
Это цепочка методов, и каждый метод в этой цепочке будет выполняться независимо от того, как должен работать базовый API.
1) getNullPoJo()
2) r = getDefaultPoJo()
3) orElse(r)
Чтобы выполнить метод, необходимо оценить его фактические параметры. Для вызова orElse(getDefaultPoJo())
необходимо также вызвать getDefaultPoJo()
. Вот почему вы получаете больше, чем ожидали.
Обычно вы увидите
.orElse(null);
.orElse(defaultValue);
, где null
и defaultValue
- это предопределенные значения, которые не требуют каких-либо вычислений.
С другой стороны, мы пишем
.orElseGet(() -> generateDefaultValue());
.orElseGet(() -> calculateDefaultOutcome());
, где generateDefaultValue
и calculateDefaultOutcome
- это методы, которые выполняют некоторые вычисления (интенсивные или те, которые мы не хотим выполнять до подходящего момента [ваш случай]).
Сравните
.orElseGet(() -> createDefaultPoJo());
.orElse(DEFAULT_POJO);
, где DEFAULT_POJO
- это переменная, инициализированная до вызова этого метода, а createDefaultPoJo()
- это метод, который создает экземпляр по умолчанию при каждом вызове.