Dans notre article précédent, nous avons exploré le monde de ListenableFuture. Examinons maintenant plus en détail des techniques plus avancées, en nous concentrant spécifiquement sur les transformations et le chaînage. Imaginez que nous ayons un ListenableFuture obtenu à partir d'un service asynchrone. De plus, nous avons une méthode simple :
Document parse(String xml) {//...
Au lieu de travailler avec la String elle-même, nous avons besoin du Document. Une approche consisterait à résoudre le Future et à traiter la String. Cependant, une solution plus élégante consiste à appliquer une transformation une fois que les résultats sont disponibles, ce qui fait que notre méthode se comporte comme si elle renvoyait toujours ListenableFuture. C'est remarquablement simple :
final ListenableFuture future = //... final ListenableFuture documentFuture = Futures.transform(future, new Function() { @override public Document apply(String contents) { return parse(contents); } });
Ou, pour une meilleure lisibilité :
final Function parseFun = new Function() { @override public Document apply(String contents) { return parse(contents); } }; final ListenableFuture future = //... final ListenableFuture documentFuture = Futures.transform(future, parseFun);
Même si la syntaxe Java peut avoir ses limites, concentrons-nous sur ce que nous avons réalisé. Futures.transform() n'attend pas que le ListenableFuture sous-jacent applique la transformation parse(). Au lieu de cela, il enregistre un rappel, prêt à être averti chaque fois que le futur donné se termine. Cette transformation s’applique pour nous de manière dynamique et transparente au bon moment. Nous avons encore un avenir, mais cette fois en enveloppant un document.
Maintenant, allons plus loin. Nous disposons également d'une méthode asynchrone, éventuellement de longue durée, qui calcule la pertinence (quoi que cela signifie dans ce contexte) d'un document donné :
ListenableFuture calculateRelevance(Document pageContents) {//...
Pouvons-nous d’une manière ou d’une autre l’enchaîner avec le ListenableFuture que nous possédons déjà ? Première tentative :
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);
Pour plus d'informations sur les possibilités améliorées de programmation asynchrone, visitez ce lien.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!