我曾经有一个可打电话的课
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
。
错误消息告诉您,编译器已尝试找到用于“ U
您SampleTask
的a”的类型Supplier<U>
,但找不到该类型。
Java将把lambda隐式“提升”到功能接口(例如Callable
或)Supplier
。但是它不会将功能接口视为可互换的-
也就是说,您不能Callable
在Supplier
期望的位置使用a 。
您可以就地制作合适的lambda:
SimpleTask task = new SimpleTask();
CompletableFuture.supplyAsync(() -> task.call());
请注意,如果SimpleTask
的call()
是,这是可行的:
public Double call() { // note no exception declared
return 0d;
}
这样的事实SimpleTask
发生在执行Callable
不相关的上面的代码。
如果您希望此代码与任意值一起使用Callable
,或者您声明task
为Callable
:
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易于阅读,两种语言之间的细微差别使我感到惊讶。 有些事情很容易移植(命名空间,继承等)