Java - Verbesserungen bei der CompletableFuture API
Hallo ihr zukünftigen Java-Entwickler! Ich freue mich sehr, diese aufregende Reise mit euch zu beginnen, während wir die wundersbare Welt der Verbesserungen bei der Java CompletableFuture API erkunden. Macht euch keine Sorgen, wenn ihr neu im Programmieren seid; wir beginnen mit den Grundlagen und arbeiten uns nach oben. Am Ende dieses Tutorials werdet ihr erstaunt sein, wie viel ihr gelernt habt!
Was ist CompletableFuture?
Bevor wir uns den Verbesserungen zuwenden, lassen Sie uns verstehen, was CompletableFuture ist. Stellt euch vor, ihr kocht ein komplexes Gericht. Ihr wollt nicht darauf warten, dass die Nudeln kochen, bevor ihr anfängt, Gemüse zu schneiden, oder? CompletableFuture ist wie das haben von mehreren Köchen in eurer Küche, die gleichzeitig an verschiedenen Aufgaben arbeiten. Es ist die Art und Weise von Java, asynchrone Programmierung zu handhaben, die es eurem Code ermöglicht, gleichzeitig mehrere Dinge zu tun, ohne durcheinander zu geraten.
Einfaches CompletableFuture Beispiel
Lassen wir mit einem einfachen Beispiel beginnen:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hallo, Zukunft!";
});
System.out.println(future.get());
In diesem Code erstellen wir ein CompletableFuture, das einen String zurückgibt. Die Methode supplyAsync
führt unseren Code in einem separaten Thread aus. Wir simulieren einige Arbeiten, indem wir den Thread eine Sekunde lang schlafen lassen. Danach gibt es unsere Begrüßung zurück. Die Methode get()
wartet darauf, dass die Zukunft abgeschlossen ist und gibt uns das Ergebnis.
Unterstützung für Verzögerungen und Zeitüberschreitungen
Eine der aufregenden Verbesserungen in der CompletableFuture API ist die bessere Unterstützung für Verzögerungen und Zeitüberschreitungen. Das ist wie das Einstellen eines Timers in eurer Küche - ihr wollt nicht, dass eure Sauce endlos köchelt!
Beispiel für Verzögerung
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hallo")
.thenApply(s -> s + ", Welt!")
.completeOnTimeout("Zeitüberschreitung aufgetreten", 2, TimeUnit.SECONDS)
.orTimeout(3, TimeUnit.SECONDS);
System.out.println(future.get());
In diesem Beispiel erstellen wir eine Zukunft, die "Hallo" sagt, und dann ändern wir sie, sodass sie "Hallo, Welt!" sagt. Wir verwenden zwei neue Methoden:
-
completeOnTimeout
: Diese Methode wird die Zukunft mit einem Standardwert abschließen, wenn sie nicht innerhalb von 2 Sekunden abgeschlossen ist. -
orTimeout
: Diese Methode wirft eine Ausnahme, wenn die Zukunft nicht innerhalb von 3 Sekunden abgeschlossen ist.
Auf diese Weise stellen wir sicher, dass unser Code nicht endlos hängt, wenn etwas schiefgeht.
Verbesserte Unterstützung für das Subclassing
Die CompletableFuture-Klasse ist jetzt einfacher zu erweitern, was es ermöglicht, eigene spezialisierte Versionen zu erstellen. Das ist wie das Erstellen eines eigenen benutzerdefinierten Küchengeräts, das genau das tut, was ihr braucht!
Beispiel für Subclassing
public class MyFuture<T> extends CompletableFuture<T> {
@Override
public <U> MyFuture<U> thenApply(Function<? super T, ? extends U> fn) {
return (MyFuture<U>) super.thenApply(fn);
}
// Andere überschriebene Methoden...
}
MyFuture<String> myFuture = new MyFuture<>();
myFuture.complete("Hallo, benutzerdefinierte Zukunft!");
System.out.println(myFuture.get());
In diesem Beispiel erstellen wir unsere eigene MyFuture
-Klasse, die CompletableFuture
erweitert. Wir überschreiben die thenApply
-Methode, um unseren benutzerdefinierten Zukunfts-Typ zurückzugeben. Dies ermöglicht es uns, Operationen zu verketten, während wir unseren benutzerdefinierten Typ beibehalten.
Neue Fabrikmethoden
Java hat neue Fabrikmethoden eingeführt, um das Erstellen von CompletableFutures noch einfacher zu machen. Das ist wie das haben von voreingestellten Rezepten in eurem Kochbuch!
Tabelle der Fabrikmethoden
Methode | Beschreibung |
---|---|
failedFuture(Throwable ex) | Erzeugt ein CompletableFuture, das bereits mit einem Ausnahmezustand abgeschlossen ist |
completedStage(T value) | Erzeugt ein neues CompletionStage, das bereits mit dem gegebenen Wert abgeschlossen ist |
failedStage(Throwable ex) | Erzeugt ein neues CompletionStage, das bereits mit einem Ausnahmezustand abgeschlossen ist |
Beispiel für Fabrikmethoden
CompletableFuture<String> successFuture = CompletableFuture.completedFuture("Erfolg!");
CompletableFuture<String> failedFuture = CompletableFuture.failedFuture(new Exception("Ups!"));
try {
System.out.println(successFuture.get());
System.out.println(failedFuture.get());
} catch (Exception e) {
System.out.println("Ein Fehler ist aufgetreten: " + e.getMessage());
}
In diesem Beispiel verwenden wir die completedFuture
-Methode, um eine erfolgreiche Zukunft zu erstellen, und die failedFuture
-Methode, um eine bereits fehlgeschlagene zu erstellen. Dies kann nützlich für Tests oder für die Integration von synchrone und asynchrone Code sein.
Schlussfolgerung
Wow! Wir haben heute viel Boden coberter. Von der Verständigung der Basics von CompletableFuture bis hin zur Erkundung seiner neuen Verbesserungen habt ihr eure ersten Schritte in die Welt der asynchronen Programmierung in Java gemacht. Denkt daran, wie das Kochen erlernen, erfordert die Beherrschung dieser Konzepte Übung. Haltet euch nicht davon ab, zu experimentieren und Fehler zu machen - das ist, wie wir lernen!
In meinen Jahren des Unterrichtens habe ich festgestellt, dass diejenigen Schüler, die sich hervortun, diejenigen sind, die nicht害怕 mit Code ihre Hände schmutzig zu machen. Daher ermutige ich euch, diese Beispiele zu nehmen, sie zu verändern, zu brechen und zu sehen, was passiert. Das ist der beste Weg, um wirklich zu verstehen, wie sie funktionieren.
Als wir uns dem Ende nähern, erinnere ich mich an einen Schüler, der mir einmal sagte, dass das Lernen von CompletableFuture wie das Jonglieren ist - anfangs scheint es unmöglich, alle Bälle in der Luft zu halten, aber mit Übung wird es zur zweiten Natur. Also weiter üben, und bald werdet ihr komplexe asynchrone Operationen wie ein Profi jonglieren können!
Frohes Coden, zukünftige Java-Meister!
Credits: Image by storyset