有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java CompletionStage:为什么在CompletableFuture中定义allOf或anyOf

我有一个使用接口CompletionStage的框架,我很好奇为什么在CompletableFuture中找到的辅助方法anyOfallOf是在那里定义的

似乎他们应该在接口上而不是在实现上操作

到目前为止,我对CompletionStage界面非常不满意。 是否有其他Java库是CompletionStage兼容的,但有人可以推荐不同的超集接口

或者可能是用其他辅助方法编写的用于CompletionStage的库


共 (2) 个答案

  1. # 1 楼答案

    如果您只需要一个方法,为类型为CompletionStage的对象提供相同的anyOfallOf功能,您可以简单地求助于^{}

    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));
    }
    
  2. # 2 楼答案

    以下是我的想法

    /**
     * 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;
        }
    
    }