独眼巨人反应组织了Java 8库的寒武纪爆发

什么是独眼巨人反应?

Lambda表达式和默认方法在Java 8中的出现预示了Java语言十年来最大的结构性变化。 在此基础上构建了一些新的很酷的API,例如Stream, Optional, CompletableFuture最终Java开发人员可以以更实用的样式进行编码。 尽管这是非常受欢迎的,但对于许多增强功能而言,还远远不够。

Stream, Optional, CompletableFuture都共享相同的抽象结构并遵循相同的规则。 但是,API并未就通用方法名称达成共识,没关系提供通用接口。 例如, Stream#map / Optional#map变为CompletableFuture#thenApply 。 此外,通常在集合中缺少添加到Stream & Optional的功能。 List#map在哪里?

JDK Stream实现的性能很好,完全是懒惰的,并且设计得很好,可以扩展,但是只提供了一个有限的潜在运算符子集(也许受数据并行性的约束)。 将具有顺序Stream扩展(称为Seq )的步进库(例如jOOλ)插入到无效空间中。 Seq添加了许多其他的Streaming运算符。 通常,jOOλ添加了许多缺失的功能特征,例如元组。

cyclops-react的核心目标以及添加诸如FutureStreams之类的原始功能,是提供一种将JDK API和第三方功能库结合在一起的机制。 Java 8推出后,出现了寒武纪的酷库爆炸式增长。像Javaslang和Project Reactor这样的库。 首先, cyclops -react通过扩展JDK并利用jOOλ , pCollections和Agrona之类的其他库来做到 这 一点 。 这些库又在可能的情况下扩展了JDK接口,以添加诸如持久性集合之类的功能,并等待免费的Many Producer Single Consumer Queue。

除了重用和扩展JDK接口之外,我们的目标是通过利用第三方标准(例如反应流API)和在没有设置标准的情况下构建我们自己的抽象,使开发人员可以轻松地与外部库集成。 我们目前关注的集成库是Google的Guava,RxJava,Functional Java,Project Reactor和Javaslang 。 我们已经创建了用于包装诸如Stream, Optional & CompletableFuture类的类型的抽象-以前不存在接口,或者以前不可能存在接口。 我们之所以选择这些目标,是因为我们在微服务体系结构的生产中使用了Cyclops-react,并且能够利用正确的技术解决问题并将其与我们的其余代码库顺利集成是至关重要的。

cyclops-react是一个功能丰富的大型项目,此外还具有许多集成模块 。 在下面的文章中,我将介绍一些可用的功能,其特定目的是展示cyclops-react如何帮助将JDK上的所有点连接起来,并进入Java 8开源社区的步伐。

扩展JDK

可能的话,cyclops-react扩展了JDK API。 例如, ReactiveSeq添加了用于处理错误,异步处理的功能,并且进行了更多扩展,从而扩展了JDK Stream和jOOλ的Seq。 cyclops-react Collection扩展而不是创建新的collection实现,而是实现并扩展了适当的JDK接口。 然后, LazyFutureStream -react LazyFutureStream扩展了ReactiveSeq ,并允许在期货流上进行聚合操作,就好像它是一个简单的Stream一样(这对于异步和LazyFutureStream地处理大量典型的Java I / O操作非常有用)。

ListX扩展了List ,但添加了渴望执行的运算符

ListX<Integer> tenTimes = ListX.of(1,2,3,4).map(i->i*10);

cyclops-react增加了许多运算符供用户探索。 例如,我们可以同时在多个集合中应用函数

反应流API充当数据的生产者(发布者)和消费者(订户)之间的天然桥梁。 所有独眼巨人反应数据类型都从反应流中实现Publisher接口,并且还提供了可以转换为任何独眼巨人反应类型的Subscriber实现。 这使得与其他基于反应流的库(例如Project Reactor)的直接集成变得简单。

例如,我们可以从任何独眼巨人发布者(例如SortedSetX懒惰地填充Reactor Flux,或者从Reactor类型中填充独眼巨人反应类型。

Flux<Integer> stream = Flux.from(SortedSetX.of(1,2,3,4,5,6,7,8));
//Flux[1,2,3,4,5,6,7,8]ListX<Character> list = ListX.fromPublisher(Flux.just("a","b","c"));

Reactor Flux和Mono类型可以直接与cyclops-react For理解一起使用(每个受支持的库在它们的集成模块中也都有它们自己的本机For理解类集)。

// import static com.aol.cyclops.control.For.*;Publishers.each2(Flux.just(1,2,3), i -> ReactiveSeq.range(i,5),Tuple::tuple).printOut();/*
(1, 1)
(1, 2)
(1, 3)
(1, 4)
(2, 2)
(2, 3)
(2, 4)
(3, 3)
(3, 4)
*/

For理解是一种通过级联对适当方法的调用来管理带有flatMap和map方法的类型上的嵌套迭代的方法。 在独眼巨人反应中,嵌套语句可以访问先前语句的元素,因此For理解而言,这是管理现有行为的非常有用的方法。 例如,为了确保对可能返回空值的现有方法findId和loadData的调用(如果提供了空参数,则将引发NPE),我们可以利用For理解,仅当返回带有值的Optional时,该表达式才能安全地执行loadData来自findId()

List<Data> data = 
For.optional(findId()).optional(this::loadData);
//loadData is only called if findId() returns a value

类似地,可以使用诸如Try之类的类型来处理来自findId或loadData的异常结果,使用Futures来异步执行链接的方法,依此类推。

建立跨库抽象

Java 8将Monads引入了Java( Stream, Optional, CompletableFuture ),但没有提供有助于重用的通用接口,实际上, CompletableFuture使用的方法名称与Optional & Stream用于同一功能的方法名称明显不同。 因此map成为thenApplyflatMap thenCompose成为flatMap thenCompose 。 在Java 8世界中,单子已成为一种越来越普遍的模式,但是通常没有办法在它们之间进行抽象。 在Cyclops-react中,我们没有尝试定义代表monad的接口,而是构建了一组包装器接口和许多自定义适配器,以使跨Java 8的主要功能样式库中的不同实例适应这些包装器。 包装器扩展了AnyMAnyM缩写,并且有两个子接口– AnyMValue表示解析为单个值的任何AnyMValue类型(例如OptionalCompletableFuture )或AnyMSeq最终解析为一个值序列(例如Stream)或列表)。 独眼巨人扩展包装器提供了一种机制,用于包装来自RxJava,Guava,Reactor,FunctionalJava和Javaslang的类型。

//We can wrap any type from Reactor, RxJava,
//FunctionalJava, Javaslang, Guava
AnyMSeq<Integer> wrapped = Fj.list(List.list(1,2,3,4,5));//And manipulate it
AnyMSeq<Integer> timesTen = wrapped.map(i->i*10);

cyclops-react提供了一组通用接口,这些包装器(和其他cyclops-react类型)都继承自这些接口,从而使开发人员可以编写更多通用的可重用代码。 AnyM扩展了反应流发布者,这意味着您可以使任何Javaslang,Guava,FunctionalJava或RxJava类型成为具有Cyclops-react的反应流发布者。

AnyMSeq<Integer> wrapped = Javaslang.traversable(List.of(1,2,3,4,5));//The wrapped type is a reactive-streams publisher
Flux<Integer> fromJavaslang = Flux.from(wrapped);wrapped.forEachWithError(System.out::println,System.out::err);

此外,来自Cyclops反应的反应性功能直接在AnyM类型上提供。 这意味着,例如,我们可以安排从Javaslang或FunctionalJava流中发出数据的时间–延迟或异步执行reduce操作。

AnyMSeq<Integer> wrapped = Javaslang.traversable(Stream.of(1,2,3,4,5));CompletableFuture<Integer> asyncResult = wrapped.futureOperations(Executors.newFixedThreadPool(1)).reduce(50, (acc, next) -> acc + next);
//CompletableFuture[1550]AnyMSeq<Integer> wrapped = FJ.list(list.list(1,2,3,4,5));Eval<Integer> lazyResult = wrapped.map(i -> i * 10).lazyOperations().reduce(50, (acc,next) -> acc + next);
//Eval[15500]HotStream<Integer> emitting = wrapped.schedule("0 * * * * ?", Executors.newScheduledThreadPool(1));emitting.connect().debounce(1,TimeUnit.DAYS).forEachWithError(this::logSuccess,this::logFailure);

在cyclops-react和新的更广泛的Java 8生态系统中,都有很多值得探索的地方,希望您自己玩乐,学习Java 8并扩展Java 8的边界,这将是一次有趣的冒险!

翻译自: https://www.javacodegeeks.com/2016/05/cyclops-react-organises-cambrian-explosion-java-8-libraries.html

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

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

相关文章

C语言中文件定位函数总结

C语言中文件定位函数主要是&#xff1a;fseek, ftell, fsetpos, fgetpos。 先来讲前两个函数&#xff0c;这是最基本的定位函数&#xff1a; fseek函数&#xff1a;能把文件指针移动到文件任何位置&#xff0c;其原型是&#xff1a;int fseek(FILE *fp, long offset, int fromw…

API

api 百科名片 API&#xff08;Application Programming Interface,应用程序编程接口&#xff09;是一些预先定义的函数&#xff0c;目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力&#xff0c;而又无需访问源码&#xff0c;或理解内部工作机制的细节。目…

Matlab gatool使用方法

可以通过输入gatool或者optimtool(ga)打开图形界面或者用ga()运行命令行函数设置Fitnessfunction 和对应的Number of variables,为了提高效率最好向量化适应度函数,然后设置Vectorize参数为On可以选择相应参数进行设置Population种群参数Fitness scalling适应度比例参数Selecti…

系统模块 OS

os.system("系统命令") 调用系统命令 os.system("task kill /f /im 系统的进程") 关闭系统进程 os.listdir(地址) 扫描目录里面的文件。默认的是当前文件夹 返回一个列表 import os # os.listdir(地址) 扫描目录里面的文件。默认的是当前文件夹 print(os.…

Matlab非线性拟合工具箱cftool

一、 单一变量的曲线逼近 Matlab有一个功能强大的曲线拟合工具箱 cftool &#xff0c;使用方便&#xff0c;能实现多种类型的线性、非线性曲线拟合。下面结合我使用的 Matlab R2007b 来简单介绍如何使用这个工具箱。 假设我们要拟合的函数形式是 yA*x*x B*x, 且A>0,B>0…

jsf标签p:ajax_JSF简单Ajax示例

jsf标签<p:ajax>今天&#xff0c;我们将看到一些使用JSF的Ajax简单样本。 如果要查看有关JSF / Web应用程序的其他文章&#xff0c;请单击以下链接&#xff1a; 重定向后的JSF持久化对象和消息 &#xff0c; 使用JAAS和JSF进行用户登录验证 &#xff0c; JSF&#xff1a;…

C#中数据库事务、存储过程基本用法

SQL 事务 public bool UpdateQsRegisterSql(List<string> ids, int newQueueId, string newQueueName){using (SqlConnection con new SqlConnection(DBHelper.Instance.ConStr)){SqlTransaction tran null;try{con.Open();SqlCommand cmd con.CreateCommand();tran …

第一章 初识Mathematica

第一章 初识Mathematica 1&#xff0e;Mathematica是什么 Matematica是由美国Wolfram公司研究开发的一个著名的数学软件&#xff0c;它提供了非常强大的功能&#xff0c;能够完成符号运算、数学图形的绘制、甚至动画制作等多种操作。Matematica的基本系统主要是用C语言开发的&…

matlab中统计工具箱函数名大全

MATLAB统计工具箱包括概率分布、方差分析、假设检验、分布检验、非参数检验、回归分析、判别分析、主成分分析、因子分析、系统聚类分析、K均值聚类分析、试验设计、决策树、多元方差分析、统计过程控制和统计图形绘制等。优化工具箱包括无约束最优化、有约束最优化、二次规划、…

BIOS维修技术

BIOS是电脑中最基础且最重要的程序&#xff0c;为电脑提供最低级且最直接的硬件控制&#xff0c;电脑的原始操作都是依照固化在BIOS里的程序来完成的。因此如果BIOS出现故障将会导致影响电脑的正常工作。BIOS故障有很多&#xff0c;根据常见的BIOS故障现象及其产生的原因&#…

使用Java Servlet,JSP标签和Stormpath快速构建Java Web App

建筑物身份管理&#xff0c;包括身份验证和授权&#xff1f; 尝试Stormpath&#xff01; 我们的REST API和强大的Java SDK支持可以消除您的安全风险&#xff0c;并且可以在几分钟内实现。 注册 &#xff0c;再也不会建立auth了&#xff01; 我们刚刚发布了Java SDK的主要升级版…

Matlab optimtool优化(Optimization)工具箱

1 工具箱概述1.1 功能&#xff08;1&#xff09;求解无约束条件非线性极小值&#xff1b;&#xff08;2&#xff09;求解约束条件下非线性极小值&#xff0c;包括目标逼近问题、极大-极小值问题和半无限极小值问题&#xff1b;&#xff08;3&#xff09;求解二次规划和线性规划…

Python目录链接

第1章  就这么愉快的开始吧 课时1&#xff1a;我和python的第一次亲密接触 一、Python3的下载与安装 二、从IDIE启动Python 三、尝试点新的东西 四、为什么会这样&#xff1f; 五、课时01课后习题及答案 第2章  用Python设计一个游戏 课时2&#xff1a;用python设计第一个…

谚语幸运的开始

谚语:幸运的开始 今天收到一个朋友的邮件&#xff0c;打开一看&#xff0c;是幸运谚语&#xff0c;自以为谚语写的非常好&#xff0c;所以转写出来与朋友们分享&#xff01;希望你能得到幸运哦&#xff01;荷兰的谚语幸运谚语幸运的开始关于金钱&#xff1a;你有了钱&#xff…

VS高版本编写C程序的C4996错误

最简单的可以用的方法:选项Project | Configuration Properties | C/C | Preprocessor | Preprocessor Definitions 添加_CRT_SECURE_NO_DEPRECATE和_SCL_SECURE_NO_DEPRECATE

apache camel_什么时候使用Apache Camel?

apache camelApache Camel是JVM / Java环境中我最喜欢的开源框架之一。 它可以轻松集成使用多种协议和技术的不同应用程序。 本文介绍了何时使用Apache Camel以及何时使用其他替代方法。 问题&#xff1a;企业应用程序集成&#xff08;EAI&#xff09; 由于新产品和新应用&…

Windows、Linux和MAC的CR, LF, CR/LF换行符

在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符. Dos和windows&#xff1a; 采用回车换行CR/LF表示下一行. UNIX/Linux &#xff1a; 采用换行符LF表示下一行. MAC OS &#xff1a; 采用回车符CR表示下一行. CR用符号\r表示, 十进制ASCII代码是13, 十六进制代…

GitHub多人协作简明教程

本文面向已经了解/熟悉git基本命令但是并不熟悉如何使用GitHub进行多人协作开发项目的同学。 为了简单起见&#xff0c;这里假设只有两个开发人员&#xff0c;HuanianLi 和 DaxiangLi。他们在GitHub上的地址和角色为&#xff1a; HuanianLi: https://github.com/huanianli # M…

Matlab 图像处理

实验一 Matlab语言、数字图象基本操作 一、实验目的 1、复习MATLAB语言的基本用法&#xff1b; 2、掌握MATLAB语言中图象数据与信息的读取方法&#xff1b; 3、掌握在MATLAB中绘制灰度直方图的方法&#xff0c;了解灰度直方图的均衡化的方法。 二、实验原理 MATLAB是集数值…

JGroups:无需额外基础架构的领导人选举

嗨&#xff0c;您好&#xff0c; 在这篇文章中&#xff0c;我将展示如何在不使用任何其他基础架构&#xff08;例如Apache Zookeeper或Consul&#xff09;的情况下解决领导人选举的问题。 领导者选举是解决以下问题的一种常见方法&#xff1a;在分布式系统中&#xff0c;只有…