CompletableFuture - thenApply()和thenCompose()的区别

CompletableFuture - thenApply()和thenCompose()的区别

  • thenApply()转换的是泛型中的类型,是同一个CompletableFuture;
  • thenCompose()用来连接两个CompletableFuture,是生成一个新的CompletableFuture。他们都是让CompletableFuture可以对返回的结果进行后续操作,就像流一样进行map和flatMap的装换

thenApply

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
      return 100;
});
CompletableFuture<String> f = future.thenApplyAsync(i -> i * 10).thenApply(i -> i.toString());

System.out.println(f.get()); //"1000"

thenCompose

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
    return 100;
});
CompletableFuture<String> f = future.thenCompose( i -> {
    return CompletableFuture.supplyAsync(() -> {
        return (i * 10) + "";
    });
});

System.out.println(f.get()); //1000
CompletableFuture是Java 8引入的一个类,它提供了非阻塞的方式来处理异步编程,是Future接口的一个实现。它可以与其他的CompletableFuture对象进行组合,形成一个复杂的异步流程。CompletableFuture支持异步编程的多个方面,包括异步执行、结果处理、组合多个CompletableFuture以及异常处理等。 而Thread是Java中的一个核心类,用于表示程序中的线程。通过创建Thread类的实例并启动它,可以执行多线程操作。线程可以直接执行代码,或者通过实现Runnable接口来实现。Thread类提供了丰富的API来控制线程的行为,如启动、停止、阻塞中断等。 两者的区别主要体现在以下几个方面: 1. 编程模型:Thread的使用较为直接,涉及到线程的创建、启动管理,而CompletableFuture提供了更加灵活丰富的异步编程模型,可以更加轻松地构建复杂的异步流程。 2. 并发控制:使用Thread时需要手动处理并发控制,如使用synchronized关键字或者锁等机制来避免线程安全问题。CompletableFuture内部处理了大部分并发控制,用户可以通过其提供的方法来组合处理异步操作,而较少担心线程安全问题。 3. 异步操作的组合错误处理:CompletableFuture提供了thenApply、thenAccept、thenCompose等方法来处理结果的转换组合,以及exceptionally、handle等方法来处理异常情况。这些方法提供了链式调用的语法,使得异步操作的组合错误处理更加方便。相比之下,使用Thread来实现这些功能通常需要更复杂的代码。 4. 性能资源消耗:创建线程需要一定的资源开销,而且线程的数量是有限的。过多的线程可能会导致资源消耗过多或者上下文切换频繁,影响性能。CompletableFuture利用了线程池来复用线程,可以在执行大量异步任务时提高性能资源利用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值