当前位置: 首页 > 面试题库 >

如何转换代码以使用CompletableFuture?

孟鹏海
2023-03-14
问题内容

我曾经有一个可打电话的课

class SampleTask implements Callable<Double> {
  @Override
  public Double call() throws Exception {
    return 0d;
  }
}

我曾经用来ExecutorService提交Callable。如何更改使用CompletableFuture.supplyAsync

以下代码无法编译

SampleTask task = new SampleTask();
CompletableFuture.supplyAsync(task);

不存在变量U类型的实例,因此SampleTask符合Supplier


问题答案:

supplyAsync()期望一个,Supplier<U>而您给它一个Callable

错误消息告诉您,编译器已尝试找到用于“ USampleTask的a”的类型Supplier<U>,但找不到该类型。

Java将把lambda隐式“提升”到功能接口(例如Callable或)Supplier。但是它不会将功能接口视为可互换的-
也就是说,您不能CallableSupplier期望的位置使用a 。

您可以就地制作合适的lambda:

SimpleTask task = new SimpleTask();
CompletableFuture.supplyAsync(() -> task.call());

请注意,如果SimpleTaskcall()是,这是可行的:

 public Double call() {  // note no exception declared
    return 0d;   
 }

这样的事实SimpleTask发生在执行Callable不相关的上面的代码。

如果您希望此代码与任意值一起使用Callable,或者您声明taskCallable

Callable callable = new SimpleTask();
CompletableFuture.supplyAsync(() -> callable.call());

…然后您将收到有关未捕获的异常的编译器错误。您的lambda将需要捕获并处理该异常(可能作为未检查的异常重新抛出,如其他答案所述)。

或者您可以制作SampleTask工具Supplier<Double>

lambda的部分动机是因为写Callable得太冗长。因此,您可能会忽略中产阶级而直接去:

CompleteableFuture<Double> future = CompletableFuture.supplyAsync(() -> 0d);

这也适用于更复杂的供应商:

CompleteableFuture<Double> future = CompletableFuture.supplyAsync(() -> {
     Foo foo = slowQuery();
     return transformToDouble(foo);
});


 类似资料:
  • 我已经完成了,需要提取以“12”开头的值。我已经编写了代码并在工作。可以帮助我用正则表达式编写代码 我的出路

  • 我正在努力在我的项目中获得一个返回200个答案的邮政请求。我们有一个邮递员测试,运行良好,并生成以下代码:

  • 我有一个复杂的要求,列表中记录有注释。我们有一个报告的功能,每个变化都应该被记录和报告。因此,根据我们的设计,即使单个字段已更新,我们也会创建一个全新的记录。 现在,我们希望将注释的历史记录(按时间戳反向排序)存储在数据库中。运行查询后,我得到了评论列表,但它包含重复的条目,因为其他一些字段被更改。它还包含空条目。 我编写了以下代码来删除重复和空条目。 这个逻辑工作正常,现在已经过测试了,但是我想

  • 我以前有个可打电话的课 我曾经使用提交。如何更改为使用

  • 我非常喜欢Gremlin,但我认为有时候很难将控制台的代码转换为Java代码,例如: 在控制台工作正常,但在Java不行。有人能帮我这个代码,或者给我一个好的未来地址吗?

  • 问题内容: 我正在将Java库移植到C#。我使用的是Visual Studio 2008,因此没有停止使用的Microsoft Java语言转换助手程序(JLCA)。 我的方法是创建一个与Java库具有类似项目结构的新解决方案,然后将Java代码复制到ac#文件中,并将其逐行转换为有效的c#。考虑到我觉得Java易于阅读,两种语言之间的细微差别使我感到惊讶。 有些事情很容易移植(命名空间,继承等)