文章目录

  • thenCompose 学习

thenCompose 学习

thenCompose允许将两个异步操作进行流水线,第一个操作完成时,将其结果作为参数传递给第二个操作。

package book.java8.char11;import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.IntStream;import static java.util.stream.Collectors.toList;/*** @author MI* @version 1.0* @date 2020/12/20 10:27*/
public class CompletableFutureDemo {/*** json样式的 字符串*/static class ToStrJson {public static String toJson(IsDigits isDigits) {delay();final String result = ToStringBuilder.reflectionToString(isDigits, ToStringStyle.JSON_STYLE);System.out.println("ToStrJson:" + result);return result;}}static class IsDigits {/*** 字符串*/private final String str;/*** str中包含的数字*/private final String digit;public IsDigits(String str, String digit) {this.str = str;this.digit = digit;}public static IsDigits parse(String str) {//字符串中提取数据return new IsDigits(str, StringUtils.getDigits(str));}@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);}}private static void delay() {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}private static String apply() {delay();return RandomStringUtils.randomAlphanumeric(5);}/*** testMap 和testCompletableFuture 效果一样,为了测试 map和 CompletableFuture (thenCompose)* <p>* thenCompose允许将两个异步操作进行流水线,第一个操作完成时,将其结果作为参数传递给第二个操作。* 换句话说,可以创建两个两个CompletableFutre对象,对第一个CompletableFuture调用* thenCompose,并向其传递一个函数,* </p>*/public static void testMap() {final List<String> collect = IntStream.rangeClosed(1, 10).mapToObj(i -> {final String apply = apply();System.out.println("生成的随机字符串:" + apply);return apply;}).map(IsDigits::parse)//字符串转换成 IsDigits.map(ToStrJson::toJson)// IsDigits 转换 json字符串.collect(Collectors.toList());}public static void testCompletableFuture() {final List<CompletableFuture<String>> collect = IntStream.rangeClosed(1, 10).mapToObj(i ->CompletableFuture.supplyAsync(() -> {final String apply = apply();System.out.println("生成的随机字符串:" + apply);return apply;})).map(future -> future.thenApply(IsDigits::parse)).map(future -> future.thenCompose(isDigits ->CompletableFuture.supplyAsync(() -> ToStrJson.toJson(isDigits)))).collect(Collectors.toList());//等待 执行完毕collect.stream().map(CompletableFuture::join).collect(toList());}public static void main(String[] args) throws InterruptedException {final long start = System.nanoTime();testCompletableFuture();System.out.println();System.out.println("执行时间:" + (System.nanoTime() - start) / 1_000_000);}
}

CompletableFuture.thenCompose相关推荐

  1. CompletableFuture 实现异步计算

    在Markdown的语法中,<u>下划线</u>中的文字会被解析器加上下划线,为了不影响阅读,本文中JDK文档涉及到<U>都会替换为<N>,请各位注意. ...

  2. CompletableFuture API用法介绍(二)

    文章目录 一.纯消费 API 1.thenAccep 2.thenAcceptBoth 3.runAfterBoth 4.thenRun(Runnable action) 二.组合API 1.then ...

  3. 用java实现combin函数_Java8的CompletableFuture

    Java8的CompletableFuture Java8提供了一种函数风格的异步和事件驱动编程模型CompletableFuture,该模型不同于以往Java版本,不会造成堵塞Blocking.过去 ...

  4. CompletableFuture教程

    文章目录 前言 一.基础篇 1.案例1_ CompletableFuture.supplyAsync() 1.1.需求 1.2.代码 1.3.总结 2.案例2_ CompletableFuture.t ...

  5. java 检视_Java高并发系列——检视阅读(五)

    JUC中工具类CompletableFuture CompletableFuture是java8中新增的一个类,算是对Future的一种增强,用起来很方便,也是会经常用到的一个工具类,熟悉一下. Co ...

  6. java supplier_Java 函数式编程

    前些年 Scala 大肆流行,打出来 Java 颠覆者的旗号,究其底气来源,无非是函数式和面向对象的"完美结合",各式各样的"语法糖",但其过高的学习门槛,又给 ...

  7. 《Java 8实战》

    Java 8实战 行为参数化 行为参数化就是可以帮助你处理频繁变更的需求的一种软件开发模式.一言以蔽之,它意味 着拿出一个代码块,把它准备好却不去执行它.这个代码块以后可以被你程序的其他部分调用, 这 ...

  8. JAVA 拾遗 --Future 模式与 Promise 模式

    JAVA 拾遗 --Future 模式与 Promise 模式 写这篇文章的动机,是缘起于微信闲聊群的一场讨论,粗略整理下,主要涉及了以下几个具体的问题: 同步,异步,阻塞,非阻塞的关联及区别. JA ...

  9. Future 模式与 Promise 模式

    这篇文章主要涉及了以下几个具体的问题: 同步,异步,阻塞,非阻塞的关联及区别. JAVA 中有 callback 调用吗? jdk 包中的 Future 怎么用? Future 模式和 Promise ...

最新文章

  1. 多语言软件gettext解决方案weix_图像编辑软件 Aurora HDR 2019 多语言免费版
  2. 理解 Linux 网络栈(2):非虚拟化Linux 环境中的 Segmentation Offloading 技术
  3. 动态网页中隐藏url参数传递的方法
  4. mysql分页原理和sqlserver里面序列的用法
  5. 经典游戏底层框架--迷宫游戏构成原理剖析
  6. pythonjson实例_python:JSON的两种常用编解码方式实例解析
  7. python 字符串替换_学完Python打算出去找工作,怕找不到?看完这篇你可以提高通过率...
  8. python——pandas库之DataFrame数据结构基础
  9. CountDownLatch和Semaphore使用场景
  10. 分享Visual SVN Hook Script—— 允许客户端编辑SVN log message
  11. Linux 快捷键总结
  12. 瑞星个人防火墙万能序列号ID号
  13. ERROR 999999: Error executing function. The table name is invalid. Failed to execute (Reclassify).
  14. homework2的进展
  15. 通过存储控制器访问外设
  16. 34岁程序员月薪3万2,跳槽被国企录取,看到月收入后却犹豫了!
  17. HTML中如何自动切换页面背景图片
  18. 用 Java3D 写游戏
  19. 紫羲教你职业女性的工作服穿着
  20. Excel-VBA操作文件四大方法之一(转)

热门文章

  1. 近10年数据智能团队建设,联想总结了由内而外的发展经验 | 专访联想集团副总裁田日辉
  2. Pandas玩转数据(九) -- 时间序列的采样和画图
  3. 嵌入式与UML建模 mbus通断阀
  4. 新浪云 股票实时筛选系统 开发说明
  5. 免费长尾词挖掘API
  6. 系统架构设计——秒杀系统架构设计
  7. 3.3栈和队列的应用
  8. 代码review原则
  9. 优化 | 线性化:含绝对值的线性化
  10. 一笔画游戏路径搜索代码未优化