In unserem vorherigen Artikel haben wir die Welt von ListenableFuture erkundet. Lassen Sie uns nun tiefer in fortgeschrittenere Techniken eintauchen und uns dabei insbesondere auf Transformationen und Verkettungen konzentrieren. Stellen Sie sich vor, wir hätten eine ListenableFuture, die von einem asynchronen Dienst bezogen wurde. Zusätzlich haben wir eine einfache Methode:
Document parse(String xml) {//...
Anstatt mit dem String selbst zu arbeiten, benötigen wir das Dokument. Ein Ansatz wäre, die Zukunft aufzulösen und den String zu verarbeiten. Eine elegantere Lösung besteht jedoch darin, eine Transformation anzuwenden, sobald die Ergebnisse verfügbar sind, sodass sich unsere Methode so verhält, als würde sie immer ListenableFuture zurückgeben. Das ist bemerkenswert einfach:
final ListenableFuture future = //... final ListenableFuture documentFuture = Futures.transform(future, new Function() { @override public Document apply(String contents) { return parse(contents); } });
Oder zur besseren Lesbarkeit:
final Function parseFun = new Function() { @override public Document apply(String contents) { return parse(contents); } }; final ListenableFuture future = //... final ListenableFuture documentFuture = Futures.transform(future, parseFun);
Obwohl die Java-Syntax möglicherweise ihre Grenzen hat, konzentrieren wir uns auf das, was wir erreicht haben. Futures.transform() wartet nicht darauf, dass das zugrunde liegende ListenableFuture die parse()-Transformation anwendet. Stattdessen wird ein Rückruf registriert, der benachrichtigt werden kann, sobald die angegebene Zukunft abgeschlossen ist. Diese Transformation wird für uns im richtigen Moment dynamisch und transparent umgesetzt. Wir haben immer noch eine Zukunft, aber dieses Mal verpacken wir ein Dokument.
Jetzt gehen wir noch einen Schritt weiter. Wir haben auch eine asynchrone, möglicherweise lang laufende Methode, die die Relevanz (was auch immer das in diesem Zusammenhang bedeutet) eines bestimmten Dokuments berechnet:
ListenableFuture calculateRelevance(Document pageContents) {//...
Können wir es irgendwie mit der ListenableFuture verknüpfen, die wir bereits besitzen? Erster Versuch:
final Function> relevanceFun = new Function>() { @override public ListenableFuture apply(Document input) { return calculateRelevance(input); } }; final ListenableFuture future = //... final ListenableFuture documentFuture = Futures.transform(future, parseFun); final ListenableFuture> relevanceFuture = Futures.transform(documentFuture, relevanceFun);
Weitere Informationen zu erweiterten asynchronen Programmiermöglichkeiten finden Sie unter diesem Link.
Das obige ist der detaillierte Inhalt vonSchalten Sie mit Java Futures eine schnellere asynchrone Programmierung frei. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!