react java_独眼巨人React组织了Java 8库的寒武纪爆发

react java

什么是独眼巨人React?

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接口,以添加诸如持久性集合之类的功能,并免费等待许多生产者单个使用者队列。

除了重用和扩展JDK接口之外,我们的目标是通过利用第三方标准(例如React流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增加了许多运算符供用户探索。 例如,我们可以同时在多个集合中应用函数

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

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

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方法的类型上的嵌套迭代的方法。 在独眼巨人React中,嵌套语句可以访问先前语句的元素,因此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扩展了React流发布者,这意味着您可以使任何Javaslang,Guava,FunctionalJava或RxJava类型成为具有Cyclops-React的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);

此外,来自CyclopsReact的React性功能直接在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

react java

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

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

相关文章

oracle安装卡在create inventory_滴滴云服务器上安装Oracle12cR2单实例数据库

一、相关说明Oracle数据库是由美国甲骨文公司推出的一款优秀的关系型数据库。当前最新版为Database 19c。本文简述Oracle Database 12cR2在滴滴云主机上的安装过程。如需更权威的指导方法请参考Oracle官方安装文档。二、环境概述一台DC2云主机&#xff08;2c4g&#xff09;一个…

MyEclipse的build、clean、publish、clean(redeploy)的区别

文章目录buildcleanpublishclean(redeploy)新增了java文件或者修改了已有的java文件删除了java文件或者包修改了classes目录以外的文件build 就是将工程src目录的内容全新输出到工程的classes目录下&#xff0c;全面覆盖旧的文件&#xff0c;需要编译的会编译后再输出 clean …

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

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

【WebRTC---序篇】(二)Windows平台WebRTC源码编译

需要准备的东西 (一)一个强大的梯子(懂得都懂)!!!!!!!!! (二) 下载depot_tools Windows指定地址必须在此下载 打开这个页面,找 install depot_tools 这个关键字 请把他解压到C盘,并且设置到PATH环境变量种,且让它处于最顶端。 其他需要设置的额外变量 DEPOT_TOOLS_…

商品管理后台发布商品时,规格值组合的前端交互的实现逻辑

方案1&#xff1a;先计算总行数&#xff0c;再循环填充规格值 根据每种规格值数量计算得到总行数&#xff0c;如果下图有3种规格&#xff1a;长度、重量、大小&#xff0c;规格值个数分别为&#xff1a;3、3、2,3x3x218行。 规格种类有3种&#xff0c;于是写3层嵌套递归循环填…

python是什么牌子主机_python 收集主机信息

这篇文章是之前几篇的一个小综合。也是通过收集主机的一些参数信息&#xff0c;熟悉python里的文件读取&#xff0c;字符切割&#xff0c;字典存储等知识。文章结构&#xff1a;(1) 文章目的&#xff0c;需要收集的信息&#xff0c;并逐个分析如何获取信息。(2) 给出实现的pyth…

antlr idea 入门_ANTLR入门:构建简单的表达语言

antlr idea 入门这是该系列的第一篇文章。 本系列的目的是描述如何创建有用的语言和所有支持工具。 在本文中&#xff0c;我们将开始研究一种非常简单的表达语言。 我们将在语言沙箱中构建它&#xff0c;因此我们将其称为语言Sandy 。 我认为工具支持对于一种语言至关重要&am…

【WebRTC---源码篇】(五)WebRTC视频引擎

1. 视频数据的采集时间 2.视频分发器VideoBroadCaster

switch和toggle在软件开发中的含义和区别

switch和toggle这一对表示“切换”的单词&#xff0c;在计算机软件中我们能经常看到&#xff0c;很多时候口语中也会经常提及。但是&#xff0c;你想过它们之间有什么区别吗&#xff1f;没有区别&#xff1f;那你就大错特错了&#xff0c;区别还是很明显的&#xff0c;呵呵。 …

ios wkweb设置图片_iOS wkwebview和 uiwebview 内容图片自适应大小

- (void)webViewDidFinishLoad:(UIWebView *)webView {// 2、都有效果NSString *js"var script document.createElement(script);""script.type text/javascript;""script.text \"function ResizeImages() { ""var myimg,oldwidth;…

activiti异步执行_对基于消息队列的Activiti异步执行器进行基准测试

activiti异步执行一点历史 永无休止的一件事是&#xff0c;Activiti在某些非常大的规模的大型组织中的使用方式。 过去&#xff0c;这导致了各种优化和重构&#xff0c;其中包括异步执行器-替换旧的作业执行器。 对于未启动的用户&#xff1a;这些执行器在流程实例中处理计时器…

C++ 11 深度学习(十六)单例设计模式共享数据分析、解决,call_once

call_once std::call_once(参数一&#xff0c;参数二&#xff08;函数接口))的功能是保证一个函数只被调用一次&#xff0c;此方法具有互斥量的能力&#xff0c;并且消耗比互斥量少。此函数需要与标记std::once_flag配合使用&#xff0c;通过该标记决定函数是否调用&#xff0…

chrome浏览器设置网页快速到顶部和到底部的方法

鼠标移到浏览器的书签任意位置&#xff0c;点击鼠标右键添加书签&#xff0c;在添加书签的窗口输入名称和js代码&#xff0c;然后把书签移到浏览器书签栏的最左侧&#xff0c;这样每次浏览网页就可以使用快捷方式快速到底部或者顶部了。 快速到顶部的js代码&#xff1a;javascr…

ebp 函数堆栈esp_函数堆栈调用过程

从内存的角度详细的分析C语言中的函数调用过程&#xff1a;首先写一个测试用的代码&#xff1a;#include int add(int x, int y){int z 0;z x y;return z;}int main(){int a 1, b 2;int c 0;c add(a, b);return 0;}这是一个简单的的求和函数。其次&#xff0c;让我们确定…

apache pdfbox_Apache PDFBox命令行工具:无需Java编码

apache pdfbox在博客文章Apache PDFBox 2中 &#xff0c;我演示了将Apache PDFBox 2用作从Java代码中调用的库来操作PDF。 事实证明&#xff0c;Apache PDFBox 2还提供了可以直接从命令行直接使用的命令行工具 &#xff0c;而无需其他Java编码。 有几种命令行工具可用&#xff…

Java数组的学习

文章目录数组的声明和定义数组的特点如何使用数组数组的声明和定义 int[] ary new int[4] //动态初始化&#xff0c;长度4 int[] ary new int[]{1,2,3} //直接使用元素创建数组&#xff0c;也是动态初始化 int[] ary {1,2,3} //静态初始化// 数组变量的声明 int[] ary; in…

C++ 11 深度学习(十七)condition_variable、wait

简介 条件变量std::condition_variable的作用是阻塞线程&#xff0c;然后等待通知将其唤醒。我们可以通过某个函数判断是否符合某种条件来决定是阻塞线程等待通知还是唤醒线程&#xff0c;由此实现线程间的同步。所以简单来说condition_variable的作用就两个——等待(wait)、通…

【WebRTC---源码篇】(六)NACK判断包位置的关键算法

首先保证a与b不相等 template <typename T, T M = 0> inline bool AheadOf(T a, T b) {static_assert(std::is_unsigned<T>::value,"Type must be an unsigned integer.");return a != b && AheadOrAt<T, M>(a, b); } template <type…

spring集成mq_使用Spring Integration Java DSL与Rabbit MQ集成

spring集成mq我最近参加了在拉斯维加斯举行的2016年Spring大会 &#xff0c;很幸运地看到了我在软件世界中长期敬佩的一些人。 我亲自遇到了其中的两个人&#xff0c;他们实际上合并了几年前我与Spring Integration相关的一些次要贡献– Gary Russel和Artem Bilan &#xff0c;…

blt功能_BitBlt实现TransparentBlt

文章用BitBlt实现了TransparentBlt的功能&#xff0c;主要的工作如下&#xff1a;void TransparentBlt2(HDC hdcDest, // 目标DCint nXOriginDest, // 目标X偏移int nYOriginDest, // 目标Y偏移int nWidthDest, // 目标宽度int nHeightDest, // 目标高度HDC hdcSrc, // 源DCint…