独眼巨人反应组织了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
成为thenApply
, flatMap thenCompose
成为flatMap thenCompose
。 在Java 8世界中,单子已成为一种越来越普遍的模式,但是通常没有办法在它们之间进行抽象。 在Cyclops-react中,我们没有尝试定义代表monad的接口,而是构建了一组包装器接口和许多自定义适配器,以使跨Java 8的主要功能样式库中的不同实例适应这些包装器。 包装器扩展了AnyM
( AnyM
缩写,并且有两个子接口– AnyMValue
表示解析为单个值的任何AnyMValue
类型(例如Optional
或CompletableFuture
)或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
独眼巨人反应组织了Java 8库的寒武纪爆发相关推荐
- react java_独眼巨人React组织了Java 8库的寒武纪爆发
react java 什么是独眼巨人React? Lambda表达式和默认方法在Java 8中的到来预示了Java语言十年来最大的结构性变化. 在此基础上构建了一些新的很酷的API,例如Stream, ...
- [知行]Java题库
文章目录 励志 刷题指南 八月刷题录 1.Java引用传递与值传递 2.Java的4类流程控制语句 3.Java中的四类八种基本数据类型 4.静态变量 5.super 6. 数据类型取值范围 7.Se ...
- JAVA学习笔记—JAVA SE(四)JAVA核心库类(下)
文章目录 四.JAVA核心库类(下) 1. 异常机制和File类 1.1 异常机制 1.1.1 基本概念 1.1.2 异常的分类 1.1.3 异常的避免 1.1.4 异常的捕获 1.1.5 异常的抛出 ...
- Java密钥库及keytool使用详解
1. JAVA密钥库 1.1. keytool执行方式简单分析 keytool工具说明见下文. 在Windows环境分析keytool工具执行方式如下: JDK与JRE的bin目录中存在keytool ...
- i10在java中什么意思啊,java题库_JAVA题库的题 求答案啊!!!!!!!!!!!!!!!!_淘题吧...
⑴ JAVA题库的题 求答案啊!!!!!!!!!!!!!!!! 1.有点没太明白意思,是要求2个数相加的和吗? 导入Java.util.扫描仪: 公共类应用程序1 /** * @param参数 */ ...
- LIRe:Lucene图像检索 - 可扩展Java CBIR库
LIRe:Lucene图像检索 -可扩展Java CBIR库 摘要: LIRe(Lucene Image Retrieval)是一个轻量级的开源的用于基于内容的图像检索的Java库.它提供共同的和最先 ...
- java pem 私钥_将PEM导入Java密钥库
在我的情况下,我有一个pem文件,其中包含两个证书和一个用于相互SSL身份验证的加密私钥.所以我的pem文件看起来像这样: -----BEGIN CERTIFICATE----- ... -----E ...
- 2017国二java题库,2017全国计算机二级考试JAVA考试题库
Java是一个纯的面向对象的程序设计语言,它继承了 C++ 语言面向对象技术的核心.下面是小编收集的计算机二级考试JAVA考试题库,希望大家认真阅读! 1. 某二叉树结点的前序序列为E.A.C.B.D ...
- Java机器学习库ML之十一线性SVM
线性SVM的原理就不多说了,最强大的就是libsvm库(ml库也是用这个),参考:http://blog.csdn.net/fjssharpsword/article/details/53883340 ...
最新文章
- android圆形旋转菜单,而对于移动转换功能支持
- 细节:解析XML文档和XML字符串
- 深入理解Redis的持久化机制和原理
- python自带time库吗_Python的内置库time
- Nhibernate配置和访问数据问题
- 1.1 编程语言介绍
- 垃圾回收机制之标记清除算法
- 【智能车Code review】——坡道图像与控制处理
- 远程注入【注入分类】
- PS教程第十七课:放大看 缩小看
- eks volumn s3_和平精英:SMG战队无缘总决赛,S3前提退场原因一览
- 个人网站的搭建(基于GitHub和Jekyll主题 )
- thinkphp仿素材火教程_thinkphp6学习教程与源码 tp6开源CMS系统源码研究
- python写机器人插件_从Python写入机器人框架控制台
- Hive列合并与元素搜集
- Web笔记:jQuery的使用
- 怎么用c语言让电脑定时开关机,电脑定时开关机如何设置?小编教你设置电脑定时开机和关机...
- 国美易卡借助云计算等技术提升金融产品服务
- 设计模式学习(十七) 观察者模式 Observer
- 几种常见代码管理工具比较(2009)
热门文章
- 使用JDOM2.0.4 操作/解析xml
- JVM内存管理------垃圾搜集器参数精解
- JavaScript常用单词整理总结
- hibernate正向生成数据库表以及配置——hibernate.cfg.xml
- 新闻发布项目——实体类(newsTb)
- 2015蓝桥杯省赛---java---B---10(生命之树)
- idea 2个配置 实时编译 autowire注解错
- 服务器io修改,更改 Linux I/O 调度器来改善服务器性能
- map分组后取前10个_海关数据 | 图解前10个月外贸
- MySQL8.0: Serialized Dictionary Information(SDI) 浅析