使用Java 8 CompletableFuture和Rx-Java Observable

我想使用Java 8 CompletableFuture和Rx-Java Observable探索一个简单的分散聚集场景。

场景很简单–产生大约10个任务,每个任务返回一个字符串,最终将结果收集到一个列表中。

顺序的

其顺序版本如下:

public void testSequentialScatterGather() throws Exception {List<String> list =IntStream.range(0, 10).boxed().map(this::generateTask).collect(Collectors.toList());logger.info(list.toString());
}private String generateTask(int i) {Util.delay(2000);return i + "-" + "test";
}

随着CompletableFuture

可以使用称为supplyAsync的实用程序方法来使方法返回CompletableFuture,我正在使用此方法的一种变体,它接受要使用的显式Executor ,而且我故意为其中一个输入抛出异常:

private CompletableFuture<String> generateTask(int i,ExecutorService executorService) {return CompletableFuture.supplyAsync(() -> {Util.delay(2000);if (i == 5) {throw new RuntimeException("Run, it is a 5!");}return i + "-" + "test";}, executorService);
}

现在分散任务:

List<CompletableFuture<String>> futures =IntStream.range(0, 10).boxed().map(i -> this.generateTask(i, executors).exceptionally(t -> t.getMessage())).collect(Collectors.toList());

在分散任务结束时,结果是CompletableFuture列表。 现在,要从中获取String列表有些棘手,这里我使用Stackoverflow中建议的一种解决方案:

CompletableFuture<List<String>> result = CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).thenApply(v -> futures.stream().map(CompletableFuture::join).collect(Collectors.toList()));

这里仅使用CompletableFuture.allOf方法来构成下一步操作,一旦所有分散的任务都完成了,则一旦完成任务,期货就会再次流式传输并收集到一个字符串列表中。

然后可以异步显示最终结果:

result.thenAccept(l -> {logger.info(l.toString());
});

使用Rx-java Observable

使用Rx-java进行分散收集相对比CompletableFuture版本更干净,因为Rx-java提供了更好的方法将结果组合在一起,这也是执行分散任务的方法:

private Observable<String> generateTask(int i, ExecutorService executorService) {return Observable.<String>create(s -> {Util.delay(2000);if ( i == 5) {throw new RuntimeException("Run, it is a 5!");}s.onNext( i + "-test");s.onCompleted();}).onErrorReturn(e -> e.getMessage()).subscribeOn(Schedulers.from(executorService));
}

并分散任务:

List<Observable<String>> obs =IntStream.range(0, 10).boxed().map(i -> generateTask(i, executors)).collect(Collectors.toList());

我又有了一个Observable的列表,而我需要的是一个结果列表,Observable提供了一个合并方法来做到这一点:

Observable<List<String>> merged = Observable.merge(obs).toList();

可以订阅并在可用时打印结果:

merged.subscribe(l -> logger.info(l.toString()));

翻译自: https://www.javacodegeeks.com/2015/08/using-java-8-completablefuture-and-rx-java-observable.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度网盘限速解决方案

解决各种网盘工具的助手,解决百度网盘限速的解决办法。 KinhDown 官网:https://kinhdown.kinh.cc/ KinhDown 支持百度网盘 Windows、安卓,可以免登录解除部分百度网盘资源限速问题。 下载 雷鸟下载 雷鸟下载是一款基于多资源超线程技术的下载软件,雷鸟下载针对各类网盘做…

hdu 2028

PS:以前对long long型的数据就一直不怎么明白...弄了好久... long long a; scanf("%lld",&a); printf("%lld",a); 这样才行 代码:#include "stdio.h"void swap(long long *a,long long *b){ long long t; t*a; *a*b; *bt;}long long gcd(lon…

MyEclipes+JSP+SSH+MySQL实现一个文章发布系统

导读:随着计算机技术的迅速发展,网络正以一种前所未有的冲击力影响着人类的生产和生活。网络的快速发展,颠覆了传统的信息传播方式,冲破了传统的时间,空间的局限性,继而引发了人类阅读方式的变革。现如今,网络阅读已成为一种新的时尚,在这种趋势下,文章发布系统应运而…

zblog php 侧边栏样式,ZBlogPHP免费主题Blogs如何修改侧边栏搜索框样式?

老古偶尔访问有某些使用 ZBlogPHP 免费主题 Blogs 的站点&#xff0c;发现他们的侧边栏搜索框样式都比较丑&#xff0c;一看就知道这些站长都没有认真阅读Blogs 主题介绍页&#xff0c;因为介绍页中的第四大点侧边栏模块使用第 5 小点就介绍了如何修改侧边栏搜索框样式。下图左…

BZOJ 3511 土地划分

AC通道&#xff1a;http://www.lydsy.com/JudgeOnline/problem.php?id3511 题目分析&#xff1a; 看上去和前面的人员雇佣以及小M种田都很像。 最小割模型来求最大值&#xff0c;一般都是考虑怎样构图使得满足一个组合能被表示出来&#xff0c;而且当满足一个组合的时候&#…

MyEclipes+html+jsp+mysql实现一个物流信息网

导读:该系统使用java语言开发,使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主要界面会将所有的服务排列好,用户可以自行选择服务。用户可以查询快递的详细信息以…

oracle pl/sql编程详解,OraclePL/SQL高级编程详解

–创建一个表&#xff0c;此表作为子表create table fk_t as select *from user_objects;delete from fk_t where object_id is null;commit;–创建一个表&#xff0c;此表作为父表create table pk_t as select *from user_objects;delete from pk_t where object_id is null;c…

使用Unsafe真的是关于速度或功能吗?

总览 大约6年前&#xff0c;我开始使用一个类&#xff0c;直到那时&#xff0c;它只是一个好奇心sun.misc.Unsafe 。 我曾使用它进行反序列化和重新抛出Exception&#xff0c;但没有使用它的全部功能或公开谈论它。 我看到的第一个严重使用Unsafe的开源库是Disruptor。 这使我…

css全局设置

/***** 全局设置 *****/body,h1,h2,h3,h4,h5,h6,p,form,ul,ol,li,dt,dl,dd,th,td,label,bottom,input,textarea{ margin:0;padding:0;}body{font-family:"宋体", arial;font-size:12px;line-height:1.5;text-align:left;background:#FFF;color:#000;}h1,h2,h3,h4,h5,…

MyEclipes+JSP+tomcat+MySQL实现JavaEE平台项目管理系统

导读:随着社会信息化的发展,很多的社会管理问题也一并出现了根本性变化,项目公司的报表及文件管理也发生了变化,以前的管理是一个分布式的信息,然后围绕中心由通过简单的来传输信息,这使得办事效率非常低下,所以需要需要适用信息货的发展,开发一套项目的管理信息系统。…

可以升级oracle版本吗,怎么升级oracle版本

Oracle数据库升级也并非简单的事&#xff0c;这篇文章对Oracle那点事做了较详细的介绍&#xff1a;Oracle数据库升级或数据迁移方法研究我还属于Oracle的菜鸟&#xff0c;就不献丑介绍了。下面我就简单总结下,Oracle同版本升级的经历:升级数据库&#xff1a;1. 先检查数据库当前…

Mac OS X下安装nvm的方法

最近准备学习一下node.js&#xff0c;到youtube上搞了些视频回家看。结果在ubuntu上面安装nvm都ok了&#xff0c;坑货mac搞不定。 经过不断尝试&#xff0c;google&#xff0c;youtube&#xff0c;终于发现了如何搞定。现特将步骤记录&#xff0c;聊以自慰。 安装node.js原本需…

Myesclipe+SSH+jsp+mysql+tomcate实现一个简单的CRM客户关系管理系统

导读: CRM客户关系管理系统的目的通过客户管理,产品管理,系统管理等功能同客户建立联并收集客户信息,此基础上满足客户"一对一"个性化服务。同时信息在企业的流程上得以流转,让客户得到高效的,满意的服务。本系统包括信息管理、客户管理、产品管理等多项功能。…

adf平稳性检测_ADF声明性组件示例

adf平稳性检测在我以前的文章中&#xff0c;我答应展示如何为智能值列表创建ADF声明性组件。 因此&#xff0c;我将创建一个包含三个元素的组件&#xff1a;标签&#xff0c;输入文本和值的组合框列表。 那很容易。 我在工作空间中创建了一个单独的ADF ViewController项目&…

oracle 计算中位数,SQL 如何计算每个分组的中位数

中位数是指一组数据排序以后&#xff0c;位于中间位置的数据值。如果数据个数是奇数&#xff0c;中位数就是最中间位置那个值&#xff1b;如果是偶数&#xff0c;则是中间位置那两个数的平均值。怎么查询出数据分组以后每个组的中位数呢&#xff1f;用SQL来解决这个问题是很有难…

OA学习笔记-006-SPRING2.5与hibernate3.5整合

一、为什么要整合 1&#xff0c;管理SessionFactory实例&#xff08;只需要一个&#xff09; 2&#xff0c;声明式事务管理 spirng的作用 IOC 管理对象.. AOP 事务管理.. 二、整合步骤 1.整合sessionFactory 在applicationContext.xml添加 1 <!-- 导入外部的properties文件 …

JSP+Tomcat+SQL Server 2000+JDBC实现合同信息管理系统

导读:随着信息科学技术的飞速发展,人们逐渐意识到对信息管理软件的运用可以使日常工作更加方便、快捷和高效。论文详细论述了公司合同管理系统的开发设计过程。软件采用JSP开发技术,Tomcat作容器, SQL Server 2000作数据库管理系统,实现了创建合同、修改合同、删除合同、合…

使用Chronicle Wire将YAML连接到文件或网络

总览 Chronicle Wire旨在在简化开发和加快调试方面获得文本协议的好处&#xff0c;但能够在不更改代码的情况下切换到性能更高且更小的二进制协议。 在这篇文章中 &#xff0c;我研究了使用基于YAML的文本格式进行序列化&#xff0c;反序列化可能会实现的性能。 不错的功能之一…

JSP+JDBC+XML+mysql实现企业电子投票系统

导读:企业电子投票系统主要用来统计网站用户对某个主题或热门话题的意见。决策者通过这些统计数据做出相应的决策。企业电子投票系统是一般网站必备的程序之一,如果网站开发者想了解用户对该网站的意见和建议。他可以设计这样一个投票主题:你认为该网站如何?(A.很好 B.一般…

冒泡排序算法。

冒泡排序算法 题目&#xff1a; 给定7个int类型的数&#xff0c;用冒泡排序实现出来。 code: public class Maopaopaixu { public static void fun() { int arr[] {9,8,6,1,5,3,2}; System.out.println("数组排序前的顺序为:"); for(in…