CompletionStage,CompletableFuture Void - 返回什么?

4

这是我的方法:

public CompletionStage<Void> insert(List<HashAction> hashActionList) {
    if(!hashActionList.isEmpty()) {
        return ...
    }
    // what to return here ?
}

如果我的列表为空,我不知道该返回什么。但不确定使用null是否好,因为之后我还需要检查null。

我已经尝试过

return CompletableFuture.completedFuture(null);

但是我并不是很确定,因为我随机选择了一个CompletionStage的实现


抛出异常?使用空列表调用它有意义吗?您的正常返回值是什么?为什么这个方法在异步操作中? - luk2302
拥有一个空列表是正确的用例,所以我不能真正抛出异常。这个方法是异步的,因为它将数据插入到Mongo集合中。我的正常返回值是void。 - maxday
1
CompletableFutureCompletionStage 的事实标准实现。事实上,CompletionStage 接口有一个方法,其唯一目的是将其转换为 CompletableFuture: #toCompletableFuture()。它也是 Java SE 提供的唯一公共实现。我的观点是返回 CompletableFuture 并不可疑。此外,由于您的方法返回 CompletionStage,因此实际返回的实现不重要。 - Slaw
如果您只是删除 !hashActionList.isEmpty() 并执行该块中的任何内容,而不管列表是否为空,会发生什么?它是否已经做了正确的事情?如果您只是尝试优化空列表情况,请返回未优化情况下返回的等效内容。另请参见创建已完成的 CompletableFuture<Void> 的正确方法是什么 - Holger
如果 hashActionList 不为空,你将返回什么? - Alexei Kaigorodov
我使用 MongoDB,insertMany 不支持空列表。 - maxday
1个回答

1

只需使用空的异步运行方法,即可返回CompletableFuture<Void>

public CompletionStage<Void> insert(List<String> hashActionList) {
    if(!hashActionList.isEmpty()) {
        return null;
    }
    return CompletableFuture.runAsync(()->{});
}

或者你可以使用thenAccept返回CompletionStage<Void>,避免空值

return CompletableFuture.completedFuture(null).thenAccept(i->{});

当返回类型为CompletionStage时,返回null似乎与直觉相反。个人而言,我认为这与返回类型为Optional时返回null是一样的。 - Slaw
3
调用runAsync(()->{})或者thenAccept(i->{})有何意义?这只是浪费资源,最终的结果和调用completedFuture(null)没有任何区别。 - Holger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接