Sobes.tech
Назад к вопросам
Junior — Middle
72

Какое различие между методами 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".

Но поведение отличается:

  1. При вызове orElse(getDefaultName()) метод getDefaultName() выполнится сразу, даже если name не пустой.
  2. При вызове orElseGet(() -> getDefaultName()) getDefaultName() выполнится только если name пустой.
  3. Если Optional содержит значение, orElseGet не вызовет Supplier, а orElse все равно уже успеет вычислить аргумент.

Это особенно важно, если создание значения по умолчанию связано с запросом в БД, чтением файла или другой дорогой операцией.

Ключевые моменты:

  • orElse — eager, то есть вычисляет аргумент сразу.
  • orElseGet — lazy, то есть вызывает Supplier только при пустом Optional.
  • Для простых и дешевых значений разница обычно не критична.
  • Для дорогих операций лучше использовать orElseGet.
  • Если значение по умолчанию содержит побочные эффекты, orElse может выполнить их даже без необходимости.