2016-02-22 1 views
2

J'ai un cadre qui utilise l'interface CompletionStage et je suis curieux de savoir pourquoi les méthodes d'aide anyOf ou allOf trouvés dans CompletableFuture y sont définis.CompletionStage: Pourquoi allof ou ANYOF défini dans CompletableFuture

On dirait qu'ils devraient fonctionner sur les interfaces plutôt que sur la mise en œuvre?

Je suis assez insatisfait de l'interface CompletionStage jusqu'à présent. Existe-t-il d'autres bibliothèques Java compatibles avec CompletionStage mais une interface de surensemble différente que quelqu'un peut recommander?

Ou peut-être une bibliothèque écrite avec des méthodes auxiliaires supplémentaires pour travailler avec CompletionStage?

Répondre

0

Voici ce que je suis venu avec

/** 
* A class with several helper methods for working with {@link CompletionStage} 
*/ 
public class CompletionStages { 


    public static CompletionStage<Object> anyOf(CompletionStage... completionStages) { 
     if (completionStages == null) { 
      throw new IllegalArgumentException("You must pass a non-null argument for completionStages"); 
     } 
     if (completionStages.length == 0) { 
      throw new IllegalArgumentException("You must pass a non-empty argument for completionStages"); 
     } 

     CompletableFuture result = new CompletableFuture(); 
     for(CompletionStage completionStage : completionStages) { 
      completionStage.thenAccept(r -> result.complete(r)); 
     } 
     return result; 
    } 


    public static CompletionStage<Void> allOf(CompletionStage... completionStages) { 
     if (completionStages == null) { 
      throw new IllegalArgumentException("You must pass a non-null argument for completionStages"); 
     } 
     if (completionStages.length == 0) { 
      throw new IllegalArgumentException("You must pass a non-empty argument for completionStages"); 
     } 

     CompletionStage result = CompletableFuture.completedFuture(null); 
     for(int i = 0; i < completionStages.length; i++) { 
      CompletionStage curr = completionStages[i]; 
      result = result.thenAcceptBoth(curr, (o, o2) -> {}); 
     } 
     return result; 
    } 

} 
1

Si vous voulez, est une méthode fournissant la même anyOf et allOf fonctionnalité pour les objets du type CompletionStage, vous pouvez simplement recourir à toCompletableFuture:

public static CompletionStage<Object> anyOf(CompletionStage<?>... css) { 
    return CompletableFuture.anyOf(Arrays.stream(css) 
     .map(CompletionStage::toCompletableFuture).toArray(CompletableFuture[]::new)); 
} 
public static CompletionStage<Void> allOf(CompletionStage<?>... css) { 
    return CompletableFuture.allOf(Arrays.stream(css) 
     .map(CompletionStage::toCompletableFuture).toArray(CompletableFuture[]::new)); 
} 
+0

Ma question est plus de savoir pourquoi ces fonctions ne sont même pas dans l'interface. On dirait une erreur sur les développeurs JDK. – Setheron

+0

Puisqu'il s'agit d'une méthode optionnelle, il est inapproprié pour un framework de supposer. –

+0

@BenManes Qu'est-ce qui est optionnel? Ils ont inclus que dans l'implémentation CompletableFuture, il semble juste incorrect – Setheron