io流,装饰者模式_流与装饰器

io流,装饰者模式

几年前, Streams API随lambda表达式一起在Java 8中引入。 作为一名训练有素的Java专家,我尝试在我的一些项目中使用此新功能,例如here和here 。 我真的不喜欢它,然后又回到了好的老房子里。 此外,我创建了装饰库Cactoos来取代Guava ,而Guava在很多地方都不是很好。

这是一个原始示例。 假设我们有一些来自某些数据源的测量值,它们都是零到一之间的数字:

Iterable<Double> probes;

现在,我们只需要显示它们的前10个,忽略零和一,然后将它们重新缩放为(0..100) 。 听起来很容易,对吧? 有三种方法可以实现:过程式,面向对象和Java 8方法。 让我们从过程的方式开始:

int pos = 0;
for (Double probe : probes) {if (probe == 0.0d || probe == 1.0d) {continue;}if (++pos > 10) {break;}System.out.printf("Probe #%d: %f", pos, probe * 100.0d);
}

为什么这是一种程序方式? 因为这势在必行。 为什么势在必行? 因为它是程序性的。 不,我在开玩笑。

这是当务之急,因为我们正在向计算机发出有关将哪些数据放入何处以及如何对其进行迭代的指令。 我们不是在声明结果,而是必须构建它。 它可以工作,但不是真正可扩展的。 我们无法参与该算法并将其应用于另一个用例。 我们无法真正轻松地对其进行修改,例如,要从两个来源而不是一个地方获取数字,等等。这是程序性的。 说够了。 不要这样

现在,Java 8为我们提供了Streams API ,该API应该提供一种实现此目的的功能方法。 让我们尝试使用它。

首先,我们需要创建一个Stream的实例, Iterable 不允许我们直接获取它。 然后,我们使用流API来完成这项工作:

StreamSupport.stream(probes.spliterator(), false).filter(p -> p == 0.0d || p == 1.0d).limit(10L).forEach(probe -> System.out.printf("Probe #%d: %f", 0, probe * 100.0d));

这将起作用,但将对所有探针说出Probe #0 ,因为forEach()不适用于索引。 目前是没有这样的事forEachWithIndex()Stream界面的Java 8(和Java 9的太 )。 这是使用原子计数器的解决方法 :

AtomicInteger index = new AtomicInteger();
StreamSupport.stream(probes.spliterator(), false).filter(probe -> probe == 0.0d || probe == 1.0d).limit(10L).forEach(probe -> System.out.printf("Probe #%d: %f",index.getAndIncrement(),probe * 100.0d));

“那是怎么了?” 你可能会问。 首先,看看在Stream接口中找不到正确的方法时,我们遇到麻烦的Stream 。 我们立即摆脱了“流式”范式,回到了良好的旧程序全局变量(计数器)。 其次,我们真的看不到那些filter()limit()forEach()方法内部发生了什么。 它们如何工作? 该文档说,这种方法是“声明性的”,并且Stream接口中的每个方法都返回某个类的实例。 他们是什么班? 只看这段代码,我们一无所知。

此流API的最大问题是Stream接口,它非常庞大!

这两个问题是联系在一起的。 此流API的最大问题是接口Stream –很大。 在撰写本文时,有43种方法。 在一个界面中四十三! 从SOLID到后来的更严格的原则 ,这都与面向对象编程的每条原则 背道而驰 。

实现相同算法的面向对象方法是什么? 这就是我如何使用Cactoos做到的 ,这只是一个集合 原始 简单的Java类:

new And(new Mapped<Double, Scalar<Boolean>>(new Limited<Double>(new Filtered<Double>(probes,probe -> probe == 0.0d || probe == 1.0d),10),probe -> () -> {System.out.printf("Probe #%d: %f", 0, probe * 100.0d);return true;}),
).value();

让我们看看这里发生了什么。 首先, Filtered装饰了我们的可迭代probes以从中取出某些项。 注意, Filtered实现了Iterable 。 然后, Limited (也是一个Iterable )仅取出前十个项目。 然后, Mapped将每个探针转换为Scalar<Boolean>的实例,该实例执行行打印。

最后, And的实例遍历“标量”列表,并要求每个标量返回boolean 。 他们打印行并返回true 。 既然它是trueAnd使用下一个标量进行下一次尝试。 最后,其方法value()返回true

但是,等等,没有索引。 让我们添加它们。 为了做到这一点,我们只使用另一个名为AndWithIndex类:

new AndWithIndex(new Mapped<Double, Func<Integer, Boolean>>(new Limited<Double>(new Filtered<Double>(probes,probe -> probe == 0.0d || probe == 1.0d),10),probe -> index -> {System.out.printf("Probe #%d: %f", index, probe * 100.0d);return true;}),
).value();

现在,我们将探针映射到Func<Integer, Boolean> ,而不是Scalar<Boolean> Func<Integer, Boolean>以使其接受索引。

这种方法的优点在于所有类和接口都很小,这就是为什么它们很容易组合的原因。 为了限制探针的迭代,我们用Limited装饰它; 为了使它过滤,我们用Filtered装饰它; 为了做其他事情,我们创建一个新的装饰器并使用它。 我们并没有像Stream这样的单一接口。

最重要的是,装饰器是一种用于修改集合行为的面向对象的工具,而流是我什至找不到其名称的其他东西。

PS顺便说一下,这就是在Guava的Iterables的帮助下可以实现相同算法的方式:

Iterable<Double> ready = Iterables.limit(Iterables.filter(probes,probe -> probe == 0.0d || probe == 1.0d),10
);
int pos = 0;
for (Double probe : probes) {System.out.printf("Probe #%d: %f", pos++, probe * 100.0d);
}

这是一些面向对象和功能样式的怪异组合。

翻译自: https://www.javacodegeeks.com/2017/10/streams-vs-decorators.html

io流,装饰者模式

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

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

相关文章

海湾汉字编码表全部_汉字编码简明对照表

汉字编码简明对照表说明&#xff1a;1、下列汉字取自国标(GB 2312-80)中的分级与排列内容&#xff1b;包含所有的第一级汉字和第二级汉字中的常用部分。2、第一级汉字(16—55区的汉字)以拼音字母为序进行排列&#xff0c;同音字以笔形顺序横、竖、撇、捺、折为序&#xff0c;起…

现代计算机教室布置图片,高中教室布置设计图

A&#xff1a;买几盆花要容易活的比如仙人球就不错还有买几张白纸布置一下学习园地在上面贴些作文*等可以*出不错的氛围办个比较好的黑板报&#xff0c;如果有兴趣可以做一些墙报。在教室的前面可以贴一些学有些教室布置是布置了&#xff0c;但很不理想&#xff1a;有的贴挂得五…

vb.net 同时给多个属性赋值_Python尚学堂高淇|1721时间表示unix时间点毫秒微秒time模块浮点数自动转换强制转换增强赋值运算符...

017浮点数-自动转换-强制转换-增强赋值运算符浮点数称为float用a*b^10形式表示的科学计数法&#xff0c;比如:3.14,314E-2或者314e-2这些数字在内存当中也是按照科学计数法存储、>>>float(3)3>>>314E-23.14>>>float(“3.14”)3.14>>>int(3…

计算机键盘复制键是哪个,键盘按什么键复制粘贴_键盘上复制粘贴快捷键是哪个键-win7之家...

使用电脑的时候经常会需要使用到复制粘贴功能&#xff0c;许多用户可能会习惯使用右键来复制粘贴&#xff0c;其实这样有点麻烦&#xff0c;比较简单的就是使用快捷键来操作&#xff0c;但是有部分用户还不知道键盘按什么键复制粘贴&#xff0c;如果你也有一样需求的话&#xf…

junit5和junit4_JUnit 5 –基础

junit5和junit4JUnit 5是适用于Java的下一代单元测试框架&#xff0c;具有许多有趣的功能&#xff0c;包括嵌套测试&#xff0c;参数化测试&#xff0c;新的扩展API或Java 8支持。 本文展示了JUnit 5的基本概念&#xff0c;包括测试生命周期&#xff0c;参数注入和声明&#x…

我的世界java无法安装包_手把手教你搭建java环境

前文由于一些历史原因,开发java程序需要技术人员自行搭建环境,而搭建环境对于新手来说并不友好,不像其他语言那般方便,现如今,为帮助想入门java却无法顺利搭建的同学,编写该教程,如果觉得本文有用,请添加关注,更多java教程,后续更新~第一步 下载JDK可自行前往Oracle官网下载指定…

FTP协议安全分析

文章目录前 言第一章 FTP协议一、协议简介二、数据表示&#xff08;一&#xff09;文件类型&#xff08;二&#xff09;格式控制&#xff08;三&#xff09;结构&#xff08;四&#xff09;传输方式三、FTP命令四、FTP应答五、连接管理第二章 安全隐患一、FTP服务器软件漏洞二、…

vs 2019 社区版许可证过期_Switch版《最终幻想12:黄道时代》对比PS4版 就没差

2017年7月发布的“最终幻想12”重制版《最终幻想12&#xff1a;黄道时代》登陆PS4平台&#xff0c;4月30日这款经典游戏还将登陆Xbox One和Switch平台&#xff0c;都将支持60帧运行。那么游戏在Switch这款掌机上的表现到底如何呢&#xff1f;油管频道Direct-Feed Games就为大家…

四川大学金融转计算机,[请教]川大和西财哪个金融系好?!

西郊网友们学学&#xff1a;看到别人学校比自己母校强心里不舒服怎么办&#xff1f;大洋之岸(1qaz2wsx33edc)其实这里很多人可能都有过这样的体验&#xff1a;当其它学校获得成绩的时候&#xff0c;当其它学校比自己母校进步更快的时候&#xff0c;心里免不了有点酸溜溜的感觉&…

MacBook/MacOS/Mac OS 查看进程/端口信息的相关命令

文章目录使用命令 lsof 查看某个端口的使用情况使用命令 netstat 查看某个端口的使用情况使用命令 ps 查看指定进程的信息&#xff08;一&#xff09;命令&#xff1a;ps auwx | grep sshd&#xff08;二&#xff09;命令&#xff1a;ps -ef | grep ssh&#xff08;三&#xff…

mfc 弹簧_弹簧和线程:异步

mfc 弹簧以前&#xff0c;我们开始使用spring和TaskExecutor &#xff0c;因此我们对如何在spring应用程序中使用线程更加熟悉。 但是&#xff0c;使用任务执行程序可能比较麻烦&#xff0c;尤其是当我们需要执行简单的操作时。 Spring的异步方法可以解决。 您不必为可运行对…

g30u盘启动 中科曙光1620_I620-G30

请选择国家/地区Afghanistan (93)Albania (355)Algeria (213)Andorra (376)Angola (244)Antigua and Barbuda (1268)Argentina (54)Armenia (374)Australia (61)Austria (43)Azerbaijan (994)Bahamas (1242)Bahrain (973)Bangladesh (880)Belarus (375)Belgium (32)Belize (501…

局域网限速软件_8款Windows实用软件推荐,纯干货,总有一款是你必备的

开学后&#xff0c;有些小伙伴得走进大学校门&#xff0c;有些小伙伴走向公司大门&#xff0c;不管你做出了哪种选择&#xff0c;最终都会走向社会&#xff0c;走向岗位。我已经毕业走向社会近10年了&#xff0c;珍藏了一些小视频&#xff0c;呃说错了&#xff0c;是珍藏了一些…

MySQL 插入数据时,中文乱码问题的解决

当向 MySQL 数据库插入一条带有中文的数据如下&#xff1a; insert into employee values(null,张三,female,1995-10-08,2015-11-12,Sales,2000,是个好员工&#xff01;); 出现乱码时&#xff0c;可以使用语句 show variables like character%; 来查看当前数据库的字符编码集…

javaserver_什么是JavaServer Faces(JSF)

javaserver这是一个分为两部分的系列&#xff0c;其中我介绍了JSF 2及其如何适合Java EE生态系统。 在第1部分中&#xff0c;我将介绍JavaServer Pages&#xff08;JSF&#xff09;背后的基本思想 &#xff0c;在第2部分中&#xff0c;我将介绍Facelets声明语言 。 在构建Web…

安装计算机一级出现appcrash,win10系统运行程序出现appcrash错误的办法

win10系统使用久了&#xff0c;好多网友反馈说win10系统运行程序出现appcrash错误的问题&#xff0c;非常不方便。有什么办法可以永久解决win10系统运行程序出现appcrash错误的问题&#xff0c;面对win10系统运行程序出现appcrash错误的图文步骤非常简单&#xff0c;只需要1、同…

winpe镜像文件iso下载_下载:微软正式发布Win10 2004版并即日起开始推送

PS&#xff1a;关于Windows 10 v2004版蓝点网早前已建立专题&#xff0c;目前该专题已收录关于该版本的101篇文章&#xff0c;微信篇幅有限无法全部发过来&#xff0c;准备升级的用户建议点击阅读原文按钮或使用电脑访问蓝点网首页查看Windows 10 v2004专题。刚刚微软在官方博客…

Linux 命令之 cat -- 在终端设备上显示文件内容(查看文件内容/浏览文件内容)

文章目录一、命令介绍二、命令选项三、参考示例&#xff08;一&#xff09;查看文件的内容&#xff0c;并显示行数编号&#xff08;二&#xff09;把 test4.txt 的内容加上行号后输出到 test3.txt 这个文档里&#xff08;三&#xff09;清空 test4.txt 的内容&#xff08;四&am…

少儿计算机兴趣小组活动记录,2013年度儿童画兴趣小组活动记录Word编辑

《2013年度儿童画兴趣小组活动记录Word编辑》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《2013年度儿童画兴趣小组活动记录Word编辑(16页珍藏版)》请在人人文库网上搜索。1、传播优秀Word版文档 &#xff0c;希望对您有帮助&#xff0c;可双击去除&#xff01;岑兜…

java变量_Java变量

java变量变数 变量是Java程序中基本的存储单元。 变量由标识符&#xff0c;类型和可选的初始化程序的组合定义。 此外&#xff0c;所有变量都有一个范围&#xff0c;该范围定义了它们的可见性和生存期。 接下来将检查这些元素。 声明变量 在Java中&#xff0c;必须先声明所有变…