Перш за все перевірити декларацію обох методів.
1) OrElse: виконайте логіку та передайте результат як аргумент.
public T orElse(T other) {
return value != null ? value : other;
}
2) OrElseGet: Виконайте логіку, якщо значення всередині необов'язкового є нульовим
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
Деякі пояснення вищенаведеного оголошення:
Аргумент "Optional.orElse" завжди виконується незалежно від значення об'єкта в необов'язковому (нульовому, порожньому або зі значенням). Завжди враховуйте вищезазначений момент, маючи на увазі під час використання "Optional.orElse", інакше використання "Optional.orElse" може бути дуже ризикованим у наступній ситуації.
Ризик-1) Проблема ведення журналу: Якщо вміст всередині orElse містить будь-який випадок журналу: у цьому випадку ви будете щоразу реєструвати його.
Optional.of(getModel())
.map(x -> {
//some logic
})
.orElse(getDefaultAndLogError());
getDefaultAndLogError() {
log.error("No Data found, Returning default");
return defaultValue;
}
Ризик-2) Випуск продуктивності: Якщо вміст всередині orElse є трудомістким: вміст, який вимагає часу, може бути будь-якими операціями вводу-виводу DB, викликом API, зчитуванням файлів. Якщо ми помістимо такий вміст у orElse (), система в кінцевому підсумку виконає код без використання.
Optional.of(getModel())
.map(x -> //some logic)
.orElse(getDefaultFromDb());
getDefaultFromDb() {
return dataBaseServe.getDefaultValue(); //api call, db call.
}
Ризик-3) Неправомірний стан або помилка: Якщо вміст всередині orElse мутує якийсь стан об'єкта: ми можемо використовувати один і той же об’єкт в іншому місці, скажімо, у функції Optional.map, і це може поставити нас у критичну помилку.
List<Model> list = new ArrayList<>();
Optional.of(getModel())
.map(x -> {
})
.orElse(get(list));
get(List < String > list) {
log.error("No Data found, Returning default");
list.add(defaultValue);
return defaultValue;
}
Потім, коли ми можемо піти з orElse ()?
Віддайте перевагу використанню orElse, коли значенням за замовчуванням є якийсь постійний об'єкт, enum. У всіх вищезазначених випадках ми можемо використовувати Optional.orElseGet () (який виконується лише тоді, коли необов'язково містить непорожнє значення) замість Optional.orElse (). Чому ?? У orElse ми передаємо значення результату за замовчуванням, але в orElseGet ми передаємо Постачальника, а метод Постачальника виконує лише, якщо значення в Додатковому є нульовим.
Ключові відходи від цього:
- Не використовуйте "Optional.orElse", якщо він містить будь-який запис журналу.
- Не використовуйте "Optional.orElse", якщо він містить логіку, що вимагає часу.
- Не використовуйте "Optional.orElse", якщо він мутує певний стан об'єкта.
- Використовуйте "Optional.orElse", якщо нам доведеться повертати константу, перерахунок.
- Віддайте перевагу "Необов’язково.орЕльсеГет" у ситуаціях, зазначених у 1,2 та 3-му пунктах.
Я пояснив це у пункті 2 ( "Необов’язково. Карта / опціональний.орЕльз"! = "Якщо / ще" ) у своєму середньому блозі. Використовуйте Java8 як програміст, а не як кодер
orElseGet
викликає постачальника лише у випадку відсутності значення.