Какое различие между методами orElse и orElseGet в Java, и в чем их особенности использования?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
orElse вычисляет значение по умолчанию сразу, даже если оно не понадобится. orElseGet принимает Supplier и вызывает его только если Optional пустой. Важно понимать разницу в ленивом вычислении и выбирать orElseGet, когда значение дорого создавать.
Определение:
Оба метода используются у Optional для получения значения, если в нем ничего нет.
orElse(value)— возвращает значение изOptional, а если его нет, подставляет переданный аргумент.orElseGet(supplier)— возвращает значение изOptional, а если его нет, вызываетSupplierи берет результат.
Главное отличие: аргумент для orElse вычисляется до вызова метода, а orElseGet вычисляет значение только при необходимости.
Пример использования:
Optional<String> name = Optional.ofNullable(null);
String result1 = name.orElse(getDefaultName());
String result2 = name.orElseGet(() -> getDefaultName());
System.out.println(result1);
System.out.println(result2);
private static String getDefaultName() {
System.out.println("Generating default name");
return "Unknown";
}
Пояснение кода:
В примере Optional пустой, поэтому оба метода вернут "Unknown".
Но поведение отличается:
- При вызове
orElse(getDefaultName())методgetDefaultName()выполнится сразу, даже еслиnameне пустой. - При вызове
orElseGet(() -> getDefaultName())getDefaultName()выполнится только еслиnameпустой. - Если
Optionalсодержит значение,orElseGetне вызоветSupplier, аorElseвсе равно уже успеет вычислить аргумент.
Это особенно важно, если создание значения по умолчанию связано с запросом в БД, чтением файла или другой дорогой операцией.
Ключевые моменты:
orElse— eager, то есть вычисляет аргумент сразу.orElseGet— lazy, то есть вызываетSupplierтолько при пустомOptional.- Для простых и дешевых значений разница обычно не критична.
- Для дорогих операций лучше использовать
orElseGet. - Если значение по умолчанию содержит побочные эффекты,
orElseможет выполнить их даже без необходимости.