Optional ist ein Typ, der davon ausgeht, dass er möglicherweise null ist. Durch Speichern des Objekts im Inneren können Sie das Verhalten bei Null separat schreiben. Wenn Sie die Schlussfolgerung schreiben, können Sie die Anweisung ** "if" als Methodenkette schreiben. ** **.
Kurz gesagt, "Nurupo" ist ein Typ ...
Etwas detaillierter, in der Objektorientierung, ist ein Objekt ein riesiger Datenblock, der sich mit vielen Methoden und Feldern bewegt.
Wenn die Variable des Objekts null ist und Sie eine Methode aus dieser Variablen aufrufen, greifen Sie auf eine nicht materialisierte Methode zu und erhalten eine ** NullPointerException **.
Daher muss der Code weitgehend neu geschrieben werden, je nachdem, ob das Objekt vorhanden ist oder nicht.
Die if-Anweisung ist eine typische Syntax, die das Verhalten ändert, wenn es existiert und wenn es nicht existiert. Es ist die Grundlage der Grundlagen des Programms.
Wenn das A-Objekt vorhanden ist, können Sie beispielsweise den Wert mit der Methode getDataWord () des B-Objekts abrufen.
foo.java
~
String wantData = null;
if(A_var != null){
wantData = A_var.gethogeWord();
} else if (B_var != null){
wantData = B_var.getDataWord();
} else {
wantData = "Es gab keine(・_・`)") ;
}
System.out.println(wantData);
~
Ist das eine typische Schreibweise? Vergessen Sie natürlich nicht die impliziten ** A- und B-Fälle ** und ** A- und B-Fälle **.
Wenn Anweisungen jedoch schwierig zu verwalten sind. Darüber hinaus ist es einfach, Fälle zu kombinieren und eine Explosion zu verursachen, was das Verschachteln schwierig macht.
Wenn Sie dies mit einer Option schreiben, sieht es so aus.
foo.java
~
String wantData = null;
//Optionaler Wrap-Wert
Optional<A_class> ObjA_opt = Optional.ofNullable(A_var);
Optional<B_class> ObjB_opt = Optional.ofNullable(B_var);
//Holen Sie sich den Wert.
Optional<String>Hogeword_opt = ObjA_opt.map(A_var-> A_var.gethogeWord());
Optional<String>DataWord_opt = ObjB_opt.map(B_var -> B_var.getDataWord());
//Auswechslung
wantData = Hogeword_opt.orElseGet(() -> null);
if(wantData == null){
wantData =DataWord_opt .orElseGet(() -> null);
}
System.out.println(wantData);
~
Es ist schwer, Scheiße zu sehen, und ich frage mich, ob "wenn" herauskommt, was am meisten ist. Lassen Sie uns den Code erklären, bevor wir darauf eingehen.
Ich benutze alle optionalen Methoden. Erstens die Methode **. Of Nullable () **. Dadurch wird die potenziell null-Variable in einen optionalen Typ eingeschlossen. Dieses Mal deklarieren wir einen optionalen Typ, der ein Objekt vom Typ A_class speichert.
Dann die **. Map () ** Methode. Verwenden Sie einen Lambda-Ausdruck, um eine Variable zu erhalten, die den Rückgabewert rechts mit Optional umschließt. Dieses Mal möchte ich, dass der Getter eine Zeichenfolge zurückgibt, daher verwende ich ein optionales Objekt, in dem der Zeichenfolgentyp gespeichert ist.
Schließlich die ** getElse () ** Methode. Hier erhalten wir den Wert, den wir in das optionale Objekt eingegeben haben. Rechts neben dem Lambda-Ausdruck steht ** "Wert, der zugewiesen werden soll, wenn der Wert null ist" **.
Es ist hier zu beachten, dass die Methode des optionalen Typs den optionalen Typ zurückgibt. Mit anderen Worten, es kann ** in einer Zeile mit einer Methodenkette ** stehen.
Wenn Sie dies schreiben, indem Sie die Methodenkette verbinden, wird es so sein.
foo.java
~
String wantData = null;
wantData = Optional.ofNullable(A_var) //Optionaler Wrap-Wert
.map(A_var-> A_var.gethogeWord())//Methodenausführung mit dem zurückgegebenen optionalen
.orElseGet(() -> null);//Holen Sie sich den Wert.
wantData = Optional.ofNullable(B_var) //Optionaler Wrap-Wert
.map(B_var-> B_var.getDataWord())//Methodenausführung mit dem zurückgegebenen optionalen
.orElseGet(() -> null);//Holen Sie sich den Wert.
wantData = Optional.ofNullable(wantData)
.getElse(() -> "Weder war enthalten.");
System.out.println(wantData);
~
Eine Technik, die erreicht werden kann, weil alle Rückgabetypen optional sind. Ich glaube, ich habe einen ziemlich sauberen Code geschrieben. Es ist besser lesbar als die if-Anweisung, und ich denke, es ist einfacher, ähnliche Bedingungen zu erstellen und Bedingungen hinzuzufügen oder zu ändern.
Ich denke, dass eine if-Anweisung dafür in Ordnung ist, aber ich denke, dass der Effekt verstanden wird, wenn die Bedingungen komplizierter werden.
Ich konnte gut lesbare Fälle schreiben, ohne Blöcke zu verwenden.
Ja, wie kommentiert, ersetzt dies das Ergebnis von B unabhängig vom Wert von A. Das ist fürchterlich. Dies ist der Code, der ordnungsgemäß funktioniert
foo.java
~
String wantData = null;
//Deklarieren Sie optionale Variablen
Optional<A_class> A_opt = Optional.ofNullable(A_var);
Optional<B_class> B_opt = Optional.ofNullable(B_var);
wantData =A_opt.map(haitteru_A -> haitteru_A.gethogeWord())
.orElseGet(() ->//Machen Sie eine Verschachtelung im Lambda-Stil!
cm_opt.map(haitteru_B -> haitteru_B.getDataWord())//Erhalten durch die Methode auf der B-Objektseite
.orElseGet(() -> "No Password!") //Wiederausführung des Lambda-Ausdrucks Was wird zugewiesen, wenn beide null sind?
);
System.out.println(wantData);
~
Das Verständnis des Lambda-Ausdrucks ist ebenfalls heikel, und die fortgeschrittene Version ist unangenehm Ich habe versucht, es zu schaffen, aber ... am Ende ist es unvermeidlich, dass es eine nestartige Struktur haben wird ...
In diesem Code ist zu beachten, dass der endgültige Wert, der wantData zugewiesen wird, vom Typ Spring ** sein muss Die .orElsGet () -Methode funktioniert als einfache If-Anweisung auf der rechten Seite des Lambda-Ausdrucks und gibt sie sogar aus. ** Bitte beachten Sie, dass ein Compilerfehler auftritt, wenn Sie unterwegs Integer eingeben **. Hier muss man ein solides Design machen.
Optional Verwenden wir mehr. Fortschritte machen.
Recommended Posts