'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.

Dims
quelle
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).

Andy Turner
quelle
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).

Andrew Tobilko
quelle
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")
}
Yakup Ad
quelle
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).

Erwin Smout
quelle