Java 8 optional: ifPresent-Rückgabeobjekt oder ElseThrow-Ausnahme

Lesezeit: 2 Minuten

Ich versuche so etwas zu machen:

 private String getStringIfObjectIsPresent(Optional<Object> object){
        object.ifPresent(() ->{
            String result = "result";
            //some logic with result and return it
            return result;
        }).orElseThrow(MyCustomException::new);
    }

Dies wird nicht funktionieren, da ifPresent die Consumer-Funktionsschnittstelle als Parameter verwendet, die void accept(T t) hat. Es kann keinen Wert zurückgeben. Gibt es eine andere Möglichkeit, es zu tun?

  • Mögliches Duplikat von Proper use of Optional.ifPresent()

    – Krishnanuni PV

    5. Januar 2017 um 13:05 Uhr

Benutzer-Avatar
Roland

Eigentlich suchst du: Optional.map. Ihr Code würde dann so aussehen:

object.map(o -> "result" /* or your function */)
      .orElseThrow(MyCustomException::new);

Auf das Weitergeben würde ich lieber verzichten Optional falls Sie können. Am Ende gewinnen Sie nichts mit einem Optional hier. Eine etwas andere Variante:

public String getString(Object yourObject) {
  if (Objects.isNull(yourObject)) { // or use requireNonNull instead if NullPointerException suffices
     throw new MyCustomException();
  }
  String result = ...
  // your string mapping function
  return result;
}

Wenn Sie die bereits haben Optional-Objekt Aufgrund eines anderen Anrufs würde ich dir trotzdem empfehlen, das zu verwenden map-Methode, statt isPresentetc. aus dem einzigen Grund, dass ich es lesbarer finde (eindeutig eine subjektive Entscheidung ;-)).

Hier zwei Möglichkeiten:

Ersetzen ifPresent mit map und verwenden Function Anstatt von Consumer

private String getStringIfObjectIsPresent(Optional<Object> object) {
    return object
            .map(obj -> {
                String result = "result";
                //some logic with result and return it
                return result;
            })
            .orElseThrow(MyCustomException::new);
}

Verwenden isPresent:

private String getStringIfObjectIsPresent(Optional<Object> object) {
    if (object.isPresent()) {
        String result = "result";
        //some logic with result and return it
        return result;
    } else {
        throw new MyCustomException();
    }
}

  • Beachten Sie, dass die zweite Option nicht die empfohlene Methode zur Verwendung von Optionals ist

    – Kartik Chugh

    19. Juni 2020 um 21:40 Uhr

  • map ist für diese Verwendung weder vorgesehen noch ausgelegt. Es hat immer einen Rückgabetyp, also ist es besser zu tun return someOptional.orElseThrow(() -> ...); — es ist unklar, ob OP etwas zurückgeben wollte oder nicht.

    – Josch M.

    4. März 2021 um 1:17 Uhr

  • Dies ist eine bessere Antwort auf die Kartenversion.

    – Raichu

    1. August 2021 um 5:16 Uhr

Verwenden Sie die map-Funktion stattdessen. Es transformiert den Wert innerhalb des optionalen.

So was:

private String getStringIfObjectIsPresent(Optional<Object> object) {
    return object.map(() -> {
        String result = "result";
        //some logic with result and return it
        return result;
    }).orElseThrow(MyCustomException::new);
}

Ich bevorzuge die Zuordnung, nachdem ich sichergestellt habe, dass der Wert verfügbar ist

private String getStringIfObjectIsPresent(Optional<Object> object) {
   Object ob = object.orElseThrow(MyCustomException::new);
    // do your mapping with ob
   String result = your-map-function(ob);
  return result;
}

oder ein Liner

private String getStringIfObjectIsPresent(Optional<Object> object) {
   return your-map-function(object.orElseThrow(MyCustomException::new));
}

Das Beispiel, das Sie nennen, ist kein gutes Beispiel. Optional sollte nicht als Parameter an eine andere Funktion gesendet werden. Gute Praxis ist immer das Senden von Nicht-Null-Parametern an die Funktion. Damit wir immer wissen, dass die Eingabe nicht null sein wird. Dies kann unsere Code-Unsicherheit verringern.

1180050cookie-checkJava 8 optional: ifPresent-Rückgabeobjekt oder ElseThrow-Ausnahme

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy