Wählen Sie ein einzelnes Element aus
Intuitiv ist die Auswahl eines einzelnen Elements definitiv einfacher als die Auswahl mehrerer Elemente, aber hier gibt es einige Probleme. Schauen wir uns zunächst an, wo das Problem mit dem allgemeinen Ansatz liegt, und schauen wir uns dann an, wie man es mithilfe von Lambda-Ausdrücken löst.
Lassen Sie uns zunächst eine neue Methode erstellen, um ein Element zu finden, das mit einem bestimmten Buchstaben beginnt, und es dann ausdrucken.
Kopieren Sie den Codecode wie folgt:
public static void pickName(
final List<String> Namen, final String StartingLetter) {
String gefundenName = null;
for(String-Name: Namen) {
if(name.startsWith(startLetter)) {
gefundenName = Name;
brechen;
}
}
Diese Methode ist genauso stinkend wie der Müllwagen, der gerade vorbeigefahren ist. Wir haben zuerst eine neue Variable „foundName“ erstellt und sie dann auf null initialisiert – das ist die Quelle des Gestanks. Wir müssen prüfen, ob es null ist, andernfalls wird eine NullPointerException oder eine Fehlerantwort ausgelöst. Wir verwenden auch einen externen Iterator, um die Liste zu durchlaufen. Wenn wir das gewünschte Element finden, müssen wir aus der Schleife ausbrechen, was den ursprünglichen Geruch verstärkt: Paranoia des Grundtyps, Imperativstil, Veränderlichkeit, alles wird lebendig. Sobald wir die Schleife verlassen, müssen wir die Ergebnisse vor dem Drucken überprüfen. Eine so kleine Aufgabe erfordert tatsächlich einen so langen Code.
Lassen Sie uns dieses Problem noch einmal analysieren. Wir möchten lediglich in der Lage sein, das erste passende Element auszuwählen und den Fall, in dem kein solches Element vorhanden ist, sicher zu behandeln. Schreiben wir diese pickName-Methode mithilfe eines Lambda-Ausdrucks neu.
Kopieren Sie den Codecode wie folgt:
public static void pickName(
final List<String> Namen, final String StartingLetter) {
final Optional<String> FoundName =
Namen.stream()
.filter(name ->name.startsWith(startLetter))
.findFirst();
System.out.println(String.format("Ein Name, der mit %s beginnt: %s",
StartingLetter, FoundName.orElse("Kein Name gefunden")));
}
Einige leistungsstarke Funktionen im JDK machen diesen Code sehr prägnant. Zuerst verwenden wir die Filtermethode, um alle Elemente abzurufen, die die Bedingungen erfüllen, und verwenden dann die findFirst-Methode der Stream-Klasse, um das erste Element der zurückgegebenen Sammlung auszuwählen. Diese Methode gibt ein optionales Objekt zurück, das das offiziell zertifizierte Desodorierungsmittel für Nullvariablen in Java ist.
Die optionale Klasse ist sehr nützlich. Sie müssen sich keine Gedanken darüber machen, ob das Ergebnis vorhanden ist oder nicht. Es erspart uns den Ärger mit Nullzeiger-Ausnahmen und macht klarer, dass kein Ergebnis ein mögliches Ergebnis ist. Über die Methode isPresent() können wir feststellen, ob das Ergebnis vorhanden ist. Wenn wir den Ergebniswert erhalten möchten, können wir die Methode get() verwenden. Wir können auch einen Standardwert dafür festlegen, indem wir (der Name dieser Methode wird Sie schockieren) die orElse-Methode verwenden, genau wie im vorherigen Code.
Wir verwenden die Friends-Sammlung, die wir zuvor verwendet haben, um unsere pickName-Methode zu überprüfen.
Kopieren Sie den Codecode wie folgt:
pickName(friends, „N“);
pickName(friends, „Z“);
Dieser Code wählt das erste passende Element aus und gibt eine freundliche Nachricht aus, wenn es nicht gefunden wird.
Kopieren Sie den Codecode wie folgt:
Ein Name, der mit N beginnt: Nate
Ein Name, der mit Z beginnt: Kein Name gefunden
Die Kombination der Methode findFirst() und der Klasse Optional reduziert die Menge unseres Codes und sieht gut aus. Aber die Funktionen der Optional-Klasse sind noch viel mehr. Beispielsweise können Sie nicht nur einen Standardwert bereitstellen, wenn das Objekt nicht vorhanden ist, sondern ihn auch zum Ausführen eines Codeabschnitts oder eines Lambda-Ausdrucks verwenden, wenn das Ergebnis vorhanden ist, etwa so:
Kopieren Sie den Codecode wie folgt:
FoundName.ifPresent(name -> System.out.println("Hallo " + name));
Verglichen mit dem zwingenden Code, den ersten passenden Namen auszuwählen, sieht der elegante, funktionale Stil des Flows besser aus. Aber gibt es in dieser Version des Anrufablaufs zu viel zu tun? Natürlich nicht, diese Methoden sind sehr intelligent und funktionieren bei Bedarf (wir werden dies ausführlich in Lazy Evaluation of Streams auf Seite 113 untersuchen).
Das Beispiel der Auswahl eines einzelnen Elements zeigt leistungsfähigere Funktionen der JDK-Bibliothek. Schauen wir uns an, wie Lambda-Ausdrücke basierend auf einer Sammlung einen gewünschten Wert finden können.