未来和承诺的区别是什么? 它们都像未来结果的占位符,但主要的区别在哪里?
当前回答
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);
我知道已经有了一个公认的答案,但我仍然想补充我的意见:
TLDR:未来和承诺是异步操作的两个方面:消费者/调用者vs.生产者/实现者。
作为异步API方法的调用者,您将获得一个Future作为计算结果的句柄。例如,你可以对它调用get()来等待计算完成并检索结果。
现在想想这个API方法实际上是如何实现的:实现者必须立即返回一个Future。它们负责在计算完成后立即完成该future(它们将知道这一点,因为它正在实现分派逻辑;-))。它们将使用Promise/CompletableFuture来完成:立即构造并返回CompletableFuture,并在计算完成后调用complete(T result)。
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));
对于客户端代码,Promise用于在结果可用时观察或附加回调,而Future用于等待结果然后继续。从理论上讲,任何可以用未来完成的事情都可以用承诺完成,但由于风格的差异,不同语言的承诺的最终API使得链接更容易。
推荐文章
- 到底是什么导致了堆栈溢出错误?
- 为什么Android工作室说“等待调试器”如果我不调试?
- Java:路径vs文件
- ExecutorService,如何等待所有任务完成
- Maven依赖Servlet 3.0 API?
- 如何在IntelliJ IDEA中添加目录到应用程序运行概要文件中的类路径?
- getter和setter是糟糕的设计吗?相互矛盾的建议
- Android room persistent: AppDatabase_Impl不存在
- Java的String[]在Kotlin中等价于什么?
- Intellij IDEA上的System.out.println()快捷方式
- 使用Spring RestTemplate获取JSON对象列表
- Spring JPA选择特定的列
- URLEncoder不能翻译空格字符
- Java中的super()
- 如何转换JSON字符串映射<字符串,字符串>与杰克逊JSON