- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题在这里已经有了答案:
CompletableFuture | thenApply vs thenCompose
(6 个回答)
4年前关闭。
我试图理解 CompletableFuture,并遇到了 2 种方法,thenApplyAsync 和 thenCompose。
我试图了解这两者之间的区别。
CompletableFuture<String> completableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + " Printing hello");
return "Hello";
}).thenCompose((String s) -> {
return CompletableFuture.supplyAsync(() -> {
System.out.println(Thread.currentThread().getName() + " Adding abc");
return "abc "+s;});
}).thenApplyAsync((String s) -> {
System.out.println(Thread.currentThread().getName() + " Adding world");
return s + " World";
}).thenApplyAsync((String s) -> {
System.out.println(Thread.currentThread().getName() + " Adding name");
if (false) {
throw new RuntimeException("Oh no exception");
}
return s + " player!";
}).handle((String s, Throwable t) -> {
System.out.println(s != null ? s : "BLANK");
System.out.println(t != null ? t.getMessage() : "BLANK Exception");
return s != null ? s : t.getMessage();
});
thenApplyAsync
将在不同的线程中执行提供的函数并返回结果,但在内部它被包装在 CompletionStage 中。而,
thenCompose
将返回对 CompletionStage 的引用。
thenCompose
在
thenApplyAsync
?
thenApply
,这有点不同:
最佳答案
您将使用 thenCompose
当您有一个返回 CompletionStage
的操作时和 thenApply
当您的操作不返回 CompletionStage
时. -> 这是在 thenApply vs thenCompose
然而Async
CompletionStage
的变体界面有细微的差异和罕见的用例。
让我们考虑这个例子:
import java.util.concurrent.CompletableFuture;
public class Futures {
public static void main(String[] args) throws InterruptedException {
CompletableFuture<Void> c = CompletableFuture.runAsync(() -> {
System.out.println("run1: " + Thread.currentThread().getId());
});
c.whenComplete((r, t) -> {
System.out.println("I'm completed");
});
c.thenCompose(__ -> {
System.out.println("thenCompose1: " + Thread.currentThread().getId());
return CompletableFuture.runAsync(() -> {
System.out.println("run2: " + Thread.currentThread().getId());
});
}).thenRunAsync(() -> {
System.out.println("RunAsync1: " + Thread.currentThread().getId());
});
Thread.sleep(5000);
System.out.println("Finished");
}
}
run1: 11
thenCompose1: 11
run2: 12
I'm completed
RunAsync1: 11
Finished
thenApplyAsync
与影响
CompletionStage
的完成状态的非异步变体相比,不会影响原始 future 的完成状态。 .
thenCompose
thenCompose
当您有 2 个需要按顺序执行的异步操作时:
static CompletionStage<String> insert(Object database) {
throw new UnsupportedOperationException();
}
static CompletionStage<Object> get(String id) {
throw new UnsupportedOperationException();
}
public static void main(String[] args) throws InterruptedException {
Object db = new Object(); // pretend this connects to a database
CompletionStage<Object> recordInserted = insert(db).thenCompose(id -> get(id));
}
Async
thenXXXX
的变体方法
thenApplyAsync
触发发送电子邮件逻辑,因为它对您的系统并不重要。用户可以随时返回并说“再给我发送一封电子邮件”
static CompletionStage<String> register(String username) {
throw new UnsupportedOperationException();
}
static void sendConfirmationEmail(String username) {
throw new UnsupportedOperationException();
}
public static void main(String[] args) throws InterruptedException {
register("user").thenAcceptAsync(username -> sendConfirmationEmail(username));
}
Async
找到的用例变种很少,但确实存在。
关于java - CompletableFuture | thenApplyAsync 与 thenCompose 及其用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46060548/
我有以下场景。 CompletableFuture result = CompletableFuture.supplyAsync(task, executor); result.thenRun(()
这个问题在这里已经有了答案: CompletableFuture | thenApply vs thenCompose (6 个回答) 4年前关闭。 我试图理解 CompletableFuture,并
假设我有以下代码: CompletableFuture future = CompletableFuture.supplyAsync( () -> 0); thenApply 案例:
我创建了一个测试类。我创建了一个静态 ExecutorService,如下所示: private static ExecutorService service = Executors.newFixed
我是一名优秀的程序员,十分优秀!