'Optional.get ()' ohne 'isPresent ()' Prüfung


87

Ich habe den folgenden Suchcode in Java:

return getTableViewController().getMe().getColumns().stream().filter($->Database.equalsColumnName($.getId(), columnId)).findFirst().get();

Ich wollte die Spalte nach Namen finden und die erste gefundene zurückgeben.

Ich verstehe, dass es einen Fall gibt, in dem nichts gefunden wurde und verarbeitet werden sollte, aber wie?

Ist es das, was es von diesem Fluchen will:

'Optional.get()' without 'isPresent()' check

?

Wie repariert man? Ich möchte zurückkehren, nullwenn nichts gefunden wird.

AKTUALISIEREN

Okay, okay, ich wusste nur nicht, dass das findFirst()zurückkehrt Optional.


2
Beachten Sie, dass Sie $in Java nicht als Bezeichner verwenden sollten: JLS Sec 3.8 : "Das $ -Zeichen sollte nur in mechanisch generiertem Quellcode oder selten für den Zugriff auf bereits vorhandene Namen auf Legacy-Systemen verwendet werden."
Andy Turner

Antworten:


177

Ersetzen get()durch orElse(null).


1
Warum? :) Warum orElsemit "oder" beginnen?
Dims

15
Weil das der Methodenname ist. Und elseist ein Schlüsselwort.
Andy Turner

8
@Dims ist nur eine Kurzform von getOrElse, ohne das get. Mit optional sollten Sie normalerweise orElseanstelle von verwenden, getda da geteine Ausnahme ausgelöst wird, wenn der Wert null ist.
Puhlen

4
@puhlen orElseGet()nimmt a Supplier<T>, während orElse()nimmt a T. Diese sind nicht gleichwertig.
bcsb1001

1
@ bcsb1001 das ist nicht das, was er zu sagen versuchte, "getOrElse" ist ein Name, den er erfunden hat, um den Zweck von zu erklären orElse; es gibt keinen Hinweis auf orElseGetin seinem Kommentar;)
Rorrim

22
...findFirst().orElse(null);

Gibt den Wert zurück, falls vorhanden, andernfalls null. Die Dokumentation besagt, dass der übergebene Parameter sein kann null(was für orElseGetund verboten ist orElseThrow).


1
das ist teilweise wahr. findFirst () hat folgende Regel: "Wenn keine Begegnungsreihenfolge vorliegt, wird ein Element aus dem Stream zurückgegeben." -> Wenn Ihr Filter das übereinstimmende Element nicht zurückgibt, gibt findFirst () das erste zurück (außer der Stream ist vorher leer)
Fl0R1D3R

1

Meine Lösung bestand darin, dies auf diese Weise zu überprüfen

if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}

0

Optional wurde erstellt, damit Code nach all diesen Jahrzehnten endlich anfangen kann , Null zu vermeiden .

Entfernen Sie das .get (), geben Sie das Optionale selbst zurück und lassen Sie den aufrufenden Code entsprechend damit umgehen (genau wie es für den Fall tun müsste, dass Sie null zurückgeben würden).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.