Java CompletableFuture实现CompletionStageFuture接口。

CompletableFuture.applyToEither继承自CompletionStage

applyToEither方法返回一个新的CompletionStage,当此阶段或另一个给定阶段正常完成时,将使用相应的结果作为所提供函数的参数来执行。

Java文档中找到applyToEither方法的方法声明。

<U> CompletionStage<U> applyToEither(CompletionStage<? extends T> other, Function<? super T,U> fn)

类型参数U是函数的返回类型

参数other是另一个CompletionStage

参数fn是用于计算返回的CompletionStage的值的函数。

applyToEither返回新的CompletionStage

示例1:

ApplyToEitherDemo1.java

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class ApplyToEitherDemo1 {public static void main(String[] args) throws InterruptedException, ExecutionException {CompletableFuture<Person> primaryFuture = CompletableFuture.completedFuture(new Person("Mohan", "Varanasi"));CompletableFuture<Person> secondaryFuture = CompletableFuture.completedFuture(new Person("Shyam", "Prayagraj"));CompletableFuture<String> future =primaryFuture.applyToEither(secondaryFuture, person -> person.getName() + " - " +person.getCity());System.out.println(future.get());}
}

输出

Mohan - Varanasi

applyToEither方法将此完成阶段或其他通常较早完成的完成阶段的结果应用于给定函数,并返回一个新的完成阶段。

在上面的示例中,有时我们会得到primaryFuture的结果,有时会得到secondaryFuture的结果。

示例2:

ApplyToEitherDemo2.java

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
public class ApplyToEitherDemo2 {public static void main(String[] args) throws InterruptedException, ExecutionException {CompletableFuture<Person> mainFuture = CompletableFuture.supplyAsync(() -> getPerson());CompletableFuture<Person> defaultFuture = CompletableFuture.supplyAsync(() -> getDefaultFuture());CompletableFuture<String> future = mainFuture.applyToEither(defaultFuture,person -> person.getName() + " - " + person.getCity());System.out.println(future.join());}private static Person getPerson() {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}return new Person("Krishna", "Delhi");}private static Person getDefaultFuture() {return new Person("Default name", "Default city");}
}

输出

Default name - Default city

此处defaultFuture将比mainFuture早完成。

因此applyToEither会将defaultFuture的结果应用于给定函数。

示例3:acceptEither上使用applyToEither的示例。

ApplyToEitherDemo2.java

import java.util.concurrent.CompletableFuture;
public class ApplyToEitherDemo3 {public static void main(String[] args) {CompletableFuture<Person> mainFuture = CompletableFuture.supplyAsync(() -> getPerson());CompletableFuture<Person> defaultFuture = CompletableFuture.supplyAsync(() -> getDefaultFuture());CompletableFuture<String> cfuture = mainFuture.applyToEither(defaultFuture,person -> person.getName() + " - " + person.getCity());CompletableFuture<String> otherCFuture = CompletableFuture.supplyAsync(() -> getMsg());CompletableFuture<Void> cf = cfuture.acceptEither(otherCFuture, s -> System.out.println(s));cf.join();}private static String getMsg() {try {Thread.sleep(400);// Thread.sleep(1000);} catch (InterruptedException e) {System.err.println(e);}return "Namo - Gujraat";}private static Person getPerson() {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}return new Person("Krishna", "Delhi");}private static Person getDefaultFuture() {try {Thread.sleep(600);} catch (InterruptedException e) {e.printStackTrace();}return new Person("Default name", "Default city");}
}

输出

Namo - Gujraat

注:applyToEither()acceptEither()的区别

当两个future其中一个完成后,acceptEither()用于只是简单地调用一些代码,applyToEither()会返回一个新的future,这个future是在前面两个future其中一个完成后进行执行完成。

参考文献

【1】Class CompletableFuture
【2】Java CompletableFuture acceptEither()
【3】Java CompletableFuture applyToEither()

【Java 8 新特性】Java CompletableFuture applyToEither()相关推荐

  1. Java 10新特性

    Java 10新特性 Java 10是其23年历史中最快的java版本.Java因其缓慢的增长和发展而受到批评,但Java 10刚刚破坏了这一概念.Java 10是一个具有许多未来变化的版本,其范围和 ...

  2. Java 8 新特性 宋红康跟学

    Java 8 新特性 Java 8 新特性简介 思维导图 并行流与串行流 Lambda表达式 Lambda 表达式语法 语法格式一:无参,无返回值,Lambda体只需一条语句 语法格式二:Lambda ...

  3. java自动化测试语言高级之Java 9 新特性

    java自动化测试语言高级之Java 9 新特性 文章目录 java自动化测试语言高级之Java 9 新特性 Java 9 新特性 Java 9 新特性 Java 9 发布于 2017 年 9 月 2 ...

  4. java自动化测试语言高级之Java 8 新特性

    java自动化测试语言高级之Java 8 新特性 文章目录 java自动化测试语言高级之Java 8 新特性 Java 8 新特性 Java 8 新特性 Java 8 (又称为 jdk 1.8) 是 ...

  5. 七、Java 14 新特性

    七.Java 14 新特性 Java 14 已如期于 2020 年 3 月 17 日正式发布,此次更新是继半年前 Java 13 这大版本发布之后的又一次常规版本更新,即便在全球疫情如此严峻形势下,依 ...

  6. Java 9 新特性概述

    转载自 Java 9 新特性概述 Java 9 正式发布于 2017 年 9 月 21 日 .作为 Java8 之后 3 年半才发布的新版本,Java 9 带 来了很多重大的变化.其中最重要的改动是 ...

  7. IntelliJ IDEA 使用 Java 11新特性以及Java 8 以来的Java 11新特性介绍

    文章目录 Java 11 安装 IDEA 设置 特性1:lambda表达式中允许使用var 特性2: String新增REPEAT 方法,方便拷贝字符串 特性3: 文件读写更方便:readString ...

  8. Java 11 新特性

    2019独角兽企业重金招聘Python工程师标准>>> Java 11 新特性 转载于:https://my.oschina.net/u/3764794/blog/2993127

  9. Java 8新特性终极指南

    在Java Code Geeks上已经有大量的关于Java 8 的教程了,像玩转Java 8--lambda与并发,Java 8 Date Time API 教程: LocalDateTime和在Ja ...

  10. stream distinct去重_再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

最新文章

  1. java 自带thread分析工具_java自带的jvm分析工具
  2. 中英文 php cms,phpcms v9英语语言包应用详解
  3. 将C1Chart数据导出到Excel
  4. 五分钟叫你看懂美国金融危机的成因和巨大危害[转]
  5. hdu 4513(manacher+dp)
  6. before和after怎么区分_如何区分before和after~有时候觉得两者可以通用
  7. LeetCode【1--两数之和】 LeetCode【2--两数相加】
  8. easyui 收费_收费班长喻玉华三尺岗亭献青春
  9. wgs-84,gcj-02,bd-09的相互转换,高德,世界测量,百度坐标系的相互转换,坐标系转换
  10. 微服务升级_SpringCloud Alibaba工作笔记0026---Nacos之Linux安装nacos
  11. Java中的锁---队列同步器
  12. Kubernetes vs OpenStack
  13. 仿WPS PDF阅读器
  14. Logistic回归分析
  15. vue百度地图加载离线瓦片(包含百度离线文件+瓦片下载器)
  16. ros打开笔记本电脑的摄像头
  17. 【一坨理论AC的题】Orz sxy大佬
  18. Matlab电影动画的初级制作
  19. 新增收货地址【项目 商城】
  20. 8种网页数据的采集工具

热门文章

  1. 原生JS实现弹幕效果
  2. ligerUi框架简单的表格展示
  3. P2P软件工作原理是什么?
  4. html 毛笔书写效果,canvas 手写毛笔字效果
  5. 快读快写模板【附O2优化】
  6. 固克节能被终止创业板注册:年营收9.8亿 碧桂园创投是股东
  7. UML-类 图 (2)
  8. 操作系统知识点总结(十四)文件保护:文件访问类型和访问控制
  9. mpeg 音频格式科普
  10. linux学习系列-一些知识