[JAVA] Verwenden Sie nicht `get ()` ~ Loser Optional

Als ich mir die Artikel über Java Optional ansah, sah ich viele Leute, die sagten: "Auf diese Art zu unterrichten wird es nur diejenigen geben, die ** Optional verwenden, was keine klare Bedeutung hat ...", also las ich diesen Artikel zumindest als Rebellion. schreiben.

TL; DR

Diejenigen, die nur "isPresent ()" und "get ()" kennen

yamero.png

Schreib nicht so

Beim Betrachten des Artikels

null Die Prüfung erfolgt mit "Optional # isPresent ()" und der Wert wird mit "Optional # get ()" abgerufen.

Es gibt zu viele Erklärungen wie.

** Tu das nicht **. Dann ** unterscheidet sich nichts von der herkömmlichen Nullprüfung **. Anstatt sich zu ändern, hat sich die Anzahl der Typen erhöht, die Ausführungszeit hat sich erhöht, die Speichernutzung hat zugenommen ** und nur die Nachteile wurden hinzugefügt **. Ich habe keinen Verdienst.

Optional<String> someStr = Optional.of("Hello, world!");

if (someStr.isPresent()) {
    System.out.println(someStr.get()); //Tu es nicht
}

Das erste, was Sie beachten sollten, ist, dass Sie ** Optional # get () ** nicht verwenden sollten.

Es ist wichtig, also sage ich es noch einmal.

** Verwenden Sie nicht Optional # get () **. </ span>

Optional # get () ist ** eine Poop-ähnliche Methode zum Abrufen, ohne sich Gedanken darüber zu machen, ob sie null ist oder nicht **. Es ist ** unsicher **. Es ist in ** nur ** für "wenn Sie es trotzdem verwenden müssen" vorbereitet.

<! - "Es ist okay, weil ich kurz zuvor null überprüft habe" oder so ähnlich, ** Antony Hoare wird auf diesen Artikel zurückkommen, nachdem der Hintern gefickt wurde **. Wenn "es ist okay, weil ich null überprüfe", ** reicht die herkömmliche Methode **. Es ist ** bedeutungslos **. Sie können ** Optional # get () verwenden, auch wenn Sie vergessen haben, ** null zu aktivieren. ** Und Absturz **. Es ist eine dumme Geschichte. ->

Der Typ, der überspringt "Mir geht es gut, weil ich kurz zuvor null überprüfe" ** Ich werde auf diesen Artikel zurückkommen, nachdem ich mich über Antony Hoare geärgert habe **. Wenn "es ist okay, weil ich null überprüfe", ** reicht die herkömmliche Methode **. Es ist ** bedeutungslos **. Sie können ** Optional # get () verwenden, auch wenn Sie vergessen haben, ** null zu aktivieren. ** Und Absturz **. Es ist eine dumme Geschichte.

Was sollen wir dann tun? ** Verwenden Sie Optional # ifPresent () **. Diese Methode verwendet eine Methodenreferenz als Argument. Also schreibe ich den Lambda-Ausdruck hinein ... ** Sie können ihn so schreiben, ohne den Lambda-Ausdruck oder die Methodenreferenz zu kennen **.

Optional<String> someStr = Optional.of("Hello, world!");

someStr.ifPresent(x -> {
    System.out.println(x);
});

Die an Optional # ifPresent () übergebene Methodenreferenz wird nur ausgeführt, wenn sie nicht ** null ** ist. Sie können sich "x" als eine ** temporäre Variable ** vorstellen. Natürlich ist der Name kostenlos (es sei denn, Sie tragen ihn). Der Typ ist natürlich "T" für "Optional ". Es ist am besten, über Lambda-Ausdrücke und Methodenreferenzen Bescheid zu wissen, aber selbst wenn Sie es nicht wissen, sollte es ausreichen, da es wie eine reguläre if-Anweisung aussieht **.

Es kann Fälle geben, in denen Sie nicht nur ausführen möchten, wenn es nicht null ist, sondern die Aktionen nach Vorhandensein oder Fehlen eines Werts ** trennen möchten.

Optional<String> someStr = Optional.empty();

if (someStr.isPresent()) {
    System.out.println(someStr.get()); //Natürlich nicht
} else {
    System.out.println("Es gab keinen Wert");
}

Verwenden Sie in diesem Fall ** Optional # ifPresentOrElse () **.

Optional<String> someStr = Optional.empty();

someStr.ifPresentOrElse(x -> {
    System.out.println(x);
}, () -> {
    System.out.println("Es gab keinen Wert");
});

() -> ... bedeutet einen Lambda-Ausdruck ohne Argumente, aber Sie können ihn sich natürlich als "Magie vorstellen, wenn Sie keinen Wert verwenden".

Beachten Sie, dass "Optional # ifPresentOrElse ()" in Java 9 implementiert wurde, also in einer Java 8-Umgebung

Optional<String> someStr = Optional.empty();

someStr.ifPresent(x -> {
    System.out.println(x);
}); if (!someStr.isPresent()) {
    System.out.println("Es gab keinen Wert");
}

Es wird keine andere Wahl geben als zu.

Verwenden Sie nach Möglichkeit nicht "Optional # ifPresent ()"

** Wenn möglich, sollte Optional # ifPresent () auch nicht missbraucht werden **. "Optional # map ()", "Optional # flatMap ()" und "Optional # orElse ()" sollten häufig ausreichen. In der Welt von Optional ist es grundlegend, dass es keine Nullprüfung gibt.

Zum Beispiel kann das oben erwähnte Beispiel von "Optional # ifPresentOrElse ()" mit diesen Methoden präziser geschrieben werden. Wenn Sie "Optional # orElse ()" zum Entpacken verwenden, indem Sie einen Ersatzwert angeben, wenn dieser "leer" war,

Optional<String> someStr = Optional.empty();

System.out.println(someStr.orElse("Es gab keinen Wert"));

Das ist in Ordnung. Was ist, wenn "Optional " anstelle von "Optional "? Dann ist es Zeit für "Optional # map ()", die Funktion nur anzuwenden, wenn sie nicht "leer" ist.

Optional<Integer> someInt = Optional.empty();

System.out.println(someInt.map(x -> x.toString()).orElse("Es gab keinen Wert"));

Es kann präziser geschrieben werden, wenn Sie Methodenreferenzen studieren.

Optional<Integer> someInt = Optional.empty();

System.out.println(someInt.map(Object::toString).orElse("Es gab keinen Wert"));

Wenn Sie der Meinung sind, dass eine Zeile lang ist, können Sie natürlich eine Variable außerhalb definieren und herausziehen.

Weitere Beispiele finden Sie in diesem Artikel.

Es gibt zu viele Verlierer und Artikel für Verlierer werden geschrieben

Da es viele selbsternannte Kommentarartikel gibt, die Verlierer hervorbringen, ist der grundlegende Teil, dass "Optional # get ()" überhaupt nicht verwendet wird oder dass es ideal ist, Null nicht selbst zu überprüfen, nicht bekannt, daher ist es besser, nicht Optional "zu haben ”wird in einem ** ironischen Artikel ** geschrieben.

  • Ersetzen Sie "NullPointerException" durch "NoSuchElementException". Das Programm stürzt immer noch ab.

Wenn myOPoint nicht die tatsächlichen Koordinaten enthält, löst myOPoint.get (). X NoSuchElementException aus und stürzt das Programm ab. Dies ist nichts besseres als der ursprüngliche Code. Weil der Zweck des Programmierers darin besteht, alle Abstürze zu vermeiden, nicht nur die Abstürze, die durch "NullPointerException" verursacht werden.

Auch hier sind beide Codes ähnlich und "Optional" ist herkömmlichen Referenzmethoden nicht überlegen.

soreha.jpg

Nun, der Autor dieses Artikels hat wahrscheinlich einen solchen Artikel geschrieben, weil es zu viele Verlierer gab. ~~ Trotzdem gibt es einige Beschreibungen, von denen er nichts weiß. ~~

Ein Beispiel, in dem Sie möglicherweise "Optional # get ()" verwenden müssen

Aufgrund der Spezifikationen kann die ** Verarbeitung, die Ausnahmen verursachen kann, nicht außerhalb ** behandelt werden.

public static int half(int even) throws Exception {
    if (even % 2 == 0); else {
        throw new Exception();
    }
    
    return even / 2;
}

/* ... */

Optional<Integer> someInt = Optional.of(16);

/*es kann*/
try {
    if (someInt.isPresent()) {
        System.out.println(half(someInt.get()));
    }
} catch (Exception e) {
    System.out.println("Bitte geben Sie eine gerade");
}

/*Kann nicht*/
try {
    someInt.ifPresent(x -> {
        System.out.println(half(x));
    });
} catch (Exception e) {
    System.out.println("Bitte geben Sie eine gerade");
}

Um dies zu erreichen, werden in Qiita verschiedene Hacks eingeführt. Ich denke, es kann mit Entweder verwaltet werden. Es ist Monade. Nun, Java ist auch nicht offiziell.

Recommended Posts

Verwenden Sie nicht `get ()` ~ Loser Optional
Verwenden Sie keine magischen Zahlen ...
Verwendung von Java Optional
Punkt 26: Verwenden Sie keine Rohtypen
Verwendung von HttpClient (Get) von Java