未来和承诺的区别是什么? 它们都像未来结果的占位符,但主要的区别在哪里?
当前回答
Future接口中没有set方法,只有get方法,所以是只读的。 关于CompletableFuture,这篇文章可能会有帮助。 completablefuture
其他回答
在这个例子中,您可以看看如何在Java中使用Promises 用于创建异步调用序列:
doSomeProcess()
.whenResult(result -> System.out.println(String.format("Result of some process is '%s'", result)))
.whenException(e -> System.out.println(String.format("Exception after some process is '%s'", e.getMessage())))
.map(String::toLowerCase)
.mapEx((result, e) -> e == null ? String.format("The mapped result is '%s'", result) : e.getMessage())
.whenResult(s -> System.out.println(s));
Future接口中没有set方法,只有get方法,所以是只读的。 关于CompletableFuture,这篇文章可能会有帮助。 completablefuture
根据上述讨论,Promise最终被命名为CompletableFuture以包含在Java 8中,它的javadoc解释说:
一个可以显式完成的Future(设置其值和状态),并且可以用作CompletionStage,支持在其完成时触发的依赖函数和操作。
列表中还给出了一个例子:
f.then((s -> aStringFunction(s)).thenAsync(s -> ...);
注意,最终的API略有不同,但允许类似的异步执行:
CompletableFuture<String> f = ...;
f.thenApply(this::modifyString).thenAccept(System.out::println);
不确定这是否能成为一个答案,但正如我看到其他人对某人说的那样,看起来你需要对这两个概念进行两个单独的抽象,这样其中一个(未来)只是另一个(承诺)的只读视图……但实际上这是不需要的。
例如,看看在javascript中承诺是如何定义的:
https://promisesaplus.com/
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
重点是使用then方法的可组合性,如:
asyncOp1()
.then(function(op1Result){
// do something
return asyncOp2();
})
.then(function(op2Result){
// do something more
return asyncOp3();
})
.then(function(op3Result){
// do something even more
return syncOp4(op3Result);
})
...
.then(function(result){
console.log(result);
})
.catch(function(error){
console.log(error);
})
这使得异步计算看起来像同步:
try {
op1Result = syncOp1();
// do something
op1Result = syncOp2();
// do something more
op3Result = syncOp3();
// do something even more
syncOp4(op3Result);
...
console.log(result);
} catch(error) {
console.log(error);
}
这很酷。 (没有async-await那么酷,但async-await只是删除了样板文件....然后(function(result) {....从它)。
实际上它们的抽象作为承诺构造函数很好
new Promise( function(resolve, reject) { /* do it */ } );
允许你提供两个回调,它们可以用来成功完成Promise,也可以用来报错。因此,只有构造Promise的代码才能完成它,而接收已构造的Promise对象的代码具有只读视图。
通过继承,如果解析和拒绝是受保护的方法,则可以实现上述目标。
我知道已经有了一个公认的答案,但我仍然想补充我的意见:
TLDR:未来和承诺是异步操作的两个方面:消费者/调用者vs.生产者/实现者。
作为异步API方法的调用者,您将获得一个Future作为计算结果的句柄。例如,你可以对它调用get()来等待计算完成并检索结果。
现在想想这个API方法实际上是如何实现的:实现者必须立即返回一个Future。它们负责在计算完成后立即完成该future(它们将知道这一点,因为它正在实现分派逻辑;-))。它们将使用Promise/CompletableFuture来完成:立即构造并返回CompletableFuture,并在计算完成后调用complete(T result)。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap