1.thenCompose

如果你还没有了解CompletableFuture或者希望再次熟悉一下,可以参考 CompletableFuture使用方法详细说明

1.1. thenCompose的特点

thenCompose方法会在某个任务执行完成后,将该任务的执行结果作为方法入参然后执行指定的方法,该方法会返回一个新的CompletableFuture实例。

也就是对一个CompletableFuture返回的结果进行后续操作,返回一个新的CompletableFuture。

1.2.thenCompose的定义

    public <U> CompletableFuture<U> thenCompose(
Function<? super T, ? extends CompletionStage<U>> fn) {
return uniComposeStage(null, fn);
} public <U> CompletableFuture<U> thenComposeAsync(
Function<? super T, ? extends CompletionStage<U>> fn) {
return uniComposeStage(asyncPool, fn);
} public <U> CompletableFuture<U> thenComposeAsync(
Function<? super T, ? extends CompletionStage<U>> fn,
Executor executor) {
return uniComposeStage(screenExecutor(executor), fn);
}

可以看到方法的返回值CompletionStage<U>,重点就是需要理解它们的传入参数fn。接下来和thenApply进行对比说明。

2.thenApply与thenCompose的异同

thenApply和thenCompose都是对一个CompletableFuture返回的结果进行后续操作,返回一个新的CompletableFuture。

不同的是两个方法的参数不同,上面我们已经看到了thenCompose的方法定义,下面我们看看thenApply的方法定义

	public <U> CompletableFuture<U> thenApply(
Function<? super T,? extends U> fn) {
return uniApplyStage(null, fn);
} public <U> CompletableFuture<U> thenApplyAsync(
Function<? super T,? extends U> fn) {
return uniApplyStage(asyncPool, fn);
} public <U> CompletableFuture<U> thenApplyAsync(
Function<? super T,? extends U> fn, Executor executor) {
return uniApplyStage(screenExecutor(executor), fn);
}

很明显,和thenCompose方法对比,两个方法的返回值都是CompletionStage,不同之处在于它们的传入参数。

  • thenApply:fn函数是一个对一个已完成的stage或者说CompletableFuture的的返回值进行计算、操作,也就是说转换的是泛型中的类型,相当于将CompletableFuture 转换生成新的CompletableFuture
  • thenCompose:fn函数是对另一个CompletableFuture进行计算、操作,也就是说用来连接两个CompletableFuture,是生成一个新的CompletableFuture。

上面的理解吗?大白话说就是thenApply从 CompletableFuture<T> 生成新的CompletableFuture<U>,只是将CompletableFuture的T类型转换为了U类型而已,CompletableFuture还是同一个CompletableFuture。

而thenCompose是生成了一个新的CompletableFuture。

3.示例

上面只是进行了说明,接下里进行代码示例配合说明,更容易理解

thenApply示例:

    @Test
public void test() throws ExecutionException, InterruptedException {
/*
如果supplyAsync直接返回, 得到CompletableFuture<String>
现在经过了thenApply的处理, CompletableFuture<String> 转换为 CompletableFuture<Integer>, CompletableFuture是同一个
*/
final CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
// 先执行supplyAsync方法,得到返回值
return "hello";
}).thenApply(value -> {
// 接收到supplyAsync的返回值“hello”
if ("hello".equals(value)) {
return 111;
} else {
return 000;
}
}); final Integer integer = completableFuture.get();
System.out.println("结果:" + integer);
}

执行结果:

结果:111

thenCompose示例:

    @Test
public void test() throws ExecutionException, InterruptedException {
//
final CompletableFuture<Integer> completableFuture = CompletableFuture.supplyAsync(() -> {
// 先执行supplyAsync方法,得到返回值
return "hello";
}).thenCompose(value -> CompletableFuture.supplyAsync(() -> {
// thenCompose方法返回一个新的CompletableFuture
if ("hello".equals(value)) {
return 111;
} else {
return 000;
}
})); final Integer integer = completableFuture.get();
System.out.println("结果:" + integer);
}

执行结果:

结果:111

总结:thApply和thenCompose都是将一个CompletableFuture<String>转换为CompletableFuture<Integer>。

不同的是,thenApply中的传入函数的返回值是String,而thenCompose的传入函数的返回值是CompletableFuture<Integer>。

CompletableFuture的thenCompose使用具体说明的更多相关文章

  1. Java CompletableFuture 详解

    Future是Java 5添加的类,用来描述一个异步计算的结果.你可以使用isDone方法检查计算是否完成,或者使用get阻塞住调用线程,直到计算完成返回结果,你也可以使用cancel方法停止任务的执 ...

  2. 使用CompletableFuture优化你的代码执行效率

    这篇文章详细讲解java8中CompletableFuture的特性,方法以及实例. 在java8以前,我们使用java的多线程编程,一般是通过Runnable中的run方法来完成,这种方式,有个很明 ...

  3. 从CompletableFuture到异步编程设计

    从CompletableFuture到异步编程设计,笔者就分为2部分来分享CompletableFuture异步编程设计,前半部分总结下CompletableFuture使用实践,后半部分分享下Com ...

  4. Java8 异步编排类CompletableFuture

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. https://www.cnblogs.com/shijiaqi1066/p/8758206 ...

  5. Java8 增强的Future:CompletableFuture(笔记)

    CompletableFuture是Java8新增的一个超大型工具类,为什么说她大呢?因为一方面它实现了Future接口,更重要的是,它实现了CompletionStage接口.这个接口也是Java8 ...

  6. Java8 CompletableFuture 编程

    一.简介  所谓异步调用其实就是实现一个无需等待被调用函数的返回值而让操作继续运行的方法.在 Java 语言中,简单的讲就是另启一个线程来完成调用中的部分计算,使调用继续运行或返回,而不需要等待计算结 ...

  7. 搞定 CompletableFuture,并发异步编程和编写串行程序还有什么区别?你们要的多图长文

    你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough ...

  8. 异步技巧之CompletableFuture

    摘自--https://juejin.im/post/5b4622df5188251ac9766f47 异步技巧之CompletableFuture 1.Future接口 1.1 什么是Future? ...

  9. 🏆【Java技术专区】「并发编程专题」教你如何使用异步神器CompletableFuture

    前提概要 在java8以前,我们使用java的多线程编程,一般是通过Runnable中的run方法来完成,这种方式,有个很明显的缺点,就是,没有返回值.这时候,大家可能会去尝试使用Callable中的 ...

  10. CompletableFuture 使用总结

    转载请注明出处: 1.Future使用对比 Future表示一个异步计算的结果.它提供了isDone()来检测计算是否已经完成,并且在计算结束后,可以通过get()方法来获取计算结果.在异步计算中,F ...

随机推荐

  1. 【分析笔记】Linux gpio_wdt.c 看门狗设备驱动源码分析

    基本原理 该看门狗的设备驱动实现原理很简单,比较主要的有两点: 一.定时器喂狗 通过定时器根据配置文件配置的喂狗方式(如脉冲切换.电平切换),对指定的 gpio 进行脉冲切换或电平切换实现喂狗. 脉冲 ...

  2. Linux三剑客日志处理系列

    三剑客日志处理系列 一.特殊符号 1.引号系列 必会 引号 含义 单引号 所见即所得,单引号里的内容会原封不动输出 双引号 和单引号类似,对双引号里面的特殊符号进行解析,对于{}花括号(通配符)没有解 ...

  3. JSP第二次作业

    1.p39   实验2 显示当前时间,并输出上午(0-12)好,下午好(13-17),晚上好(18-23) 1 <%@ page language="java" import ...

  4. Bootstrap的Modal与WebUploader联用的问题及办法

    问题描述:在使用Bootstrap的Modal的时候,在Modal中用了WebUploader插件,然后WebUploader的绑定按钮无法点击 在网上找了一些结果,觉得,他们的问题解决方案感觉都不够 ...

  5. JAVA虚拟机06-垃圾回收及引用类型

    Java和C++之间有一堵由内存自动分配和垃圾收集技术围成的高墙 1.了解垃圾收集.内存自动分配的意义 2.JAVA虚拟机各个区域的垃圾回收简介 3.判断对象是否存活 3.1引用计数算法 3.2可达性 ...

  6. 接入jira OAuth权限流程

    如果要在自己的系统中操作jira的api完成这些单据的创建.审批等操作,就不得不要先完成jira的第三方授权,才能在第三方系统去做这些jira的操作. 首先必须在jira系统配置客户端的相关信息,须配 ...

  7. Dao包 对数据库的操作

    //添加 public static int add(Bean1 bean){ String sql = "insert into classtable(classname,teacher, ...

  8. P3387 缩点

    \(Tarjan\) 模板 #include<cstdio> #include<queue> #include<iostream> #define re regis ...

  9. JZOJ 3494. 【NOIP2013模拟联考13】线段(segment)

    题目 数轴上有很多单位线段,一开始时所有单位线段的权值都是 \(1\).有两种操作,第一种操作将某一区间内的单位线段权值乘以 \(w\),第二种操作将某一区间内的单位线段权值取 \(w\) 次幂.并且 ...

  10. 图论之最短路径Dijkstra算法

    /** 图论之最短路径Dijkstra算法 */ #include<string.h> #include<stdio.h> #include<vector> #in ...