Cf05_ThenCompose.java 1.4 KB

1234567891011121314151617181920212223242526272829303132
  1. package space.anyi;
  2. import java.util.concurrent.CompletableFuture;
  3. public class Cf05_ThenCompose {
  4. public static void main(String[] args) throws Exception {
  5. CompletableFuture<String> userFuture = CompletableFuture.supplyAsync(() -> {
  6. System.out.println("1. 查询用户");
  7. return "用户:李雷";
  8. });
  9. // 如果使用 thenApply,返回的是嵌套的 CompletableFuture<CompletableFuture<String>>,
  10. // 需要两层 join 才能取出结果,层级一多就变成"回调地狱"
  11. CompletableFuture<CompletableFuture<String>> nested =
  12. userFuture.thenApply(Cf05_ThenCompose::getOrder);
  13. System.out.println("thenApply 拼出嵌套: " + nested.getClass().getSimpleName());
  14. System.out.println(" 两层 join 取结果: " + nested.join().join());
  15. // thenCompose 接受一个返回 CompletableFuture 的函数,
  16. // 并将内层 Future 自动展平,保持链式调用只有一个层级
  17. CompletableFuture<String> flat = userFuture.thenCompose(Cf05_ThenCompose::getOrder);
  18. System.out.println("thenCompose 展平结果: " + flat.join());
  19. }
  20. // 模拟: 拿到用户后再异步查询他的订单
  21. private static CompletableFuture<String> getOrder(String user) {
  22. return CompletableFuture.supplyAsync(() -> {
  23. System.out.println("2. 异步查询 \"" + user + "\" 的订单");
  24. return "订单 O-10008";
  25. });
  26. }
  27. }