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!

Java - CompletableFuture API Improvements

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:

  1. completeOnTimeout: Diese Methode wird die Zukunft mit einem Standardwert abschließen, wenn sie nicht innerhalb von 2 Sekunden abgeschlossen ist.
  2. 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