Überprüfen Sie zunächst die Deklaration beider Methoden.
1) OrElse: Führen Sie die Logik aus und übergeben Sie das Ergebnis als Argument.
public T orElse(T other) {
return value != null ? value : other;
}
2) OrElseGet: Führen Sie die Logik aus, wenn der Wert im optionalen Wert null ist
public T orElseGet(Supplier<? extends T> other) {
return value != null ? value : other.get();
}
Einige Erklärungen zur obigen Erklärung:
Das Argument "Optional.orElse" wird immer ausgeführt, unabhängig vom Wert des Objekts in optional (null, leer oder mit Wert). Beachten Sie bei der Verwendung von „Optional.orElse“ immer den oben genannten Punkt. Andernfalls kann die Verwendung von „Optional.orElse“ in der folgenden Situation sehr riskant sein.
Risiko-1) Protokollierungsproblem: Wenn der Inhalt in orElse eine Protokollanweisung enthält: In diesem Fall werden Sie ihn jedes Mal protokollieren.
Optional.of(getModel())
.map(x -> {
//some logic
})
.orElse(getDefaultAndLogError());
getDefaultAndLogError() {
log.error("No Data found, Returning default");
return defaultValue;
}
Risiko-2) Leistungsproblem: Wenn der Inhalt in orElse zeitintensiv ist: Zeitintensiver Inhalt kann ein beliebiger DB-Aufruf für E / A-Vorgänge, ein API-Aufruf oder das Lesen von Dateien sein. Wenn wir solchen Inhalt in orElse () einfügen, führt das System einen Code aus, der keinen Nutzen hat.
Optional.of(getModel())
.map(x -> //some logic)
.orElse(getDefaultFromDb());
getDefaultFromDb() {
return dataBaseServe.getDefaultValue(); //api call, db call.
}
Risiko-3) Unzulässiger Status oder Fehler Problem : Wenn der Inhalt in orElse einen Objektstatus mutiert: Wir verwenden möglicherweise dasselbe Objekt an einer anderen Stelle, beispielsweise in der Funktion Optional.map, und es kann zu einem kritischen Fehler kommen.
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;
}
Wann können wir dann mit orElse () gehen?
Verwenden Sie lieber orElse, wenn der Standardwert ein konstantes Objekt ist, enum. In allen oben genannten Fällen können wir Optional.orElseGet () (das nur ausgeführt wird, wenn Optional einen nicht leeren Wert enthält) anstelle von Optional.orElse () verwenden. Warum?? In orElse übergeben wir den Standardergebniswert, in orElseGet übergeben wir Supplier, und die Methode des Supplier wird nur ausgeführt, wenn der Wert in Optional null ist.
Wichtige Erkenntnisse daraus:
- Verwenden Sie "Optional.orElse" nicht, wenn es eine Protokollanweisung enthält.
- Verwenden Sie "Optional.orElse" nicht, wenn es zeitintensive Logik enthält.
- Verwenden Sie "Optional.orElse" nicht, wenn ein Objektstatus mutiert wird.
- Verwenden Sie "Optional.orElse", wenn wir eine Konstante, enum, zurückgeben müssen.
- Bevorzugen Sie "Optional.orElseGet" in den in den Punkten 1,2 und 3 genannten Situationen.
Ich habe dies in Punkt 2 ( "Optional.map/Optional.orElse"! = "If / else" ) in meinem mittleren Blog erklärt. Verwenden Sie Java8 als Programmierer und nicht als Codierer
orElseGet
, ruft der Lieferant nur an, wenn kein Wert vorhanden ist.