使用Stream.peek在Java Streams内部进行窥视

对于刚接触JDK 8的管道和流的Java开发人员而言, Stream接口提供的peek(Consumer)方法可以用作可视化流操作行为的有用工具。 即使是更熟悉Java流和聚合操作的Java开发人员,有时也会发现Stream.peek(Consumer)对于理解复杂的中间流操作的含义和交互作用很有用。

Stream.peek(Consumer)方法需要一个Consumer ,它实际上是一个接受单个参数却不返回任何内容的代码块。 peek(Consumer)方法返回传递给它的流的相同元素,因此除非传递给peek(Consumer)方法的代码块使流中的对象发生突变,否则流的内容将不会更改。 。 Stream.peek(Consumer)的绝大多数用途很可能是在调用该方法时以只读方式打印流中对象的内容。

Stream.peek(Consumer)的基于Javadoc的API文档更加详细地说明了此方法的行为,并提供了其用法示例。 该示例在下面的代码清单中略作修改:

final List<String> strings= Stream.of("one", "two", "three", "four").peek(e-> out.println("Original Element: " + e)).filter(e -> e.length() > 3).peek(e -> out.println("Filtered value: " + e)).map(String::toUpperCase).peek(e -> out.println("Mapped value: " + e)).collect(Collectors.toList());
out.println("Final Results: " + strings);

执行上述代码后,其关联的输出如下所示:

Original Element: one
Original Element: two
Original Element: three
Filtered value: three
Mapped value: THREE
Original Element: four
Filtered value: four
Mapped value: FOUR
Final Results: [THREE, FOUR]

输出通过提供给它们的元素讲述了流操作的故事。 首次执行中间peek操作将使用前缀“原始元素:”将原始流中的每个元素写到系统输出中。 对于每个原始String不会执行稍后发生的中间peek操作的实例,因为这些peek操作中的每一个都至少在进行一次过滤之后发生。

启用peek输出还清楚地显示了在每个String元素上以等效的大写形式执行中间操作映射的结果。 收集操作是终止操作,因此此后不进行任何peekpeek操作的战略位置可提供对发生的流处理的重要见解。

用于Stream.peek(Consumer)的Javadoc指出:“存在此方法主要是为了支持调试,您希望在其中看到元素流过管道中特定点的情况。” 这正是上面显示的示例和输出所演示的,并且可能是Stream.peek(Consumer)的最常见应用。

Stream.peek(Consumer)的Javadoc文档以以下描述性句子开头:“返回由该流的元素组成的流,并在从结果流中消耗掉元素时对每个元素执行附加的操作。” 在前面的示例中,在消耗每个元素时对每个元素执行的操作只是将其字符串表示形式写入标准输出。 但是,采取的动作可以是可以指定为Consumer任何东西(任何接受单个参数且不返回任何参数的代码块)。 下一个示例演示如何甚至可以使用peek(Consumer)更改流上对象的内容。

在本文的第一个示例中, peek(Consumer)无法更改流元素,因为这些元素是不可变的Java String 。 然而,如果流元件是可变的,则Consumer传递给peek(Consumer)可以改变这些元素的含量。 为了说明这一点,我将使用MutablePerson显示的简单类MutablePerson

MutablePerson.java

package dustin.examples.jdk8.streams;/*** Represents person whose name can be changed.*/
public class MutablePerson
{private String name;public MutablePerson(final String newName){name = newName;}public String getName(){return name;}public void setName(final String newName){name = newName;}@Overridepublic String toString(){return name;}
}

下一个代码清单显示了当Stream.peek(Consumer)中的元素可变时, Stream.peek(Consumer)如何更改流操作的结果。

final List<MutablePerson> people= Stream.of(new MutablePerson("Fred"),new MutablePerson("Wilma"),new MutablePerson("Barney"),new MutablePerson("Betty")).peek(person -> out.println(person)).peek(person -> person.setName(person.getName().toUpperCase())).collect(Collectors.toList());
out.println("People: " + people);

执行上述代码后,它会产生如下所示的输出:

Fred
Wilma
Barney
Betty
People: [FRED, WILMA, BARNEY, BETTY]

此示例表明,传递给peekConsumer确实将人民姓名的大小写更改为大写。 这仅是可能的,因为正在处理的对象是可变的。 有人认为使用peek改变流中的元素可能是一种反模式 ,我发现自己对此方法感到不舒服(但我通常也不喜欢将方法的参数设为“ 输出参数 ”)。 peek方法的名称peek一个人只是看(而不是触摸),但是它接受的Consumer参数则宣告可以更改某些内容( Consumer的Javadoc指出,“与大多数其他功能接口不同,Consumer应该通过副作用来操作” )。 博客文章“ 使用Java Stream API进行Stream.peek(Consumer) ”讨论了使用Stream.peek(Consumer)和变异操作相关的潜在问题。

Steam.peek(Consumer)是了解流操作如何影响元素的有用工具。

翻译自: https://www.javacodegeeks.com/2018/06/peeking-inside-java-streams.html

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

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

相关文章

【定时同步系列3】8PSK调制+OM定时+信号分段处理+误码率曲线之MATLAB仿真(实信号模型)

关注公号【逆向通信猿】更精彩!!! 仿真结果 对于8PSK调制,仿真结果如下: 误码率曲线图 假设 E b / n 0 = 14 d B Eb/n_0 = 14dB

借助Web技术,桌面用户界面将保持活跃

要了解Java桌面应用程序有什么问题&#xff0c;让我们看一下JavaFX&#xff08;桌面应用程序的领先UI框架&#xff09;的新功能。 很明显&#xff0c;它正在向Web方法发展&#xff0c;从Web世界中借用了越来越多的功能。 JavaFX支持一部分CSS功能&#xff0c;并附带其自己的属性…

Win10窗口侧边栏设置Win7模式

本人非常不喜欢Win10的几个系统功能 贴靠窗口时自动调整窗口大小&#xff0c;填满可用空间关将窗口对齐时&#xff0c;显示能够在其旁边对齐的内容当我调整某个贴靠窗口的大小时&#xff0c;也调整任何相邻贴靠窗口的大小 想调整成Win7那种模式和风格的话&#xff0c;设置如下…

VS2017无法打开文件MSVCRTD.lib

需要添加组件&#xff0c;如下图

groovy 2.5.4_Java 7 vs Groovy 2.1性能比较

groovy 2.5.4自从我与Grails上一次接触以来&#xff0c;我已经有两年没有使用Groovy了。 我陷入&#xff08;硬&#xff09;核心企业Java中&#xff0c;但在后台遇到了一些性能方面的问题。 我几乎错过了学习Spock的机会&#xff0c;但是幸运的是&#xff0c; 华沙Java用户组帮…

【定时同步系列4】QPSK调制+OM定时(FFT实现及频域补偿)+信号分段处理+误码率曲线之MATLAB仿真(复信号模型)

关注公号【逆向通信猿】更精彩!!! 仿真结果 对于QPSK调制,仿真结果如下: **分析:**可以看出,补偿前的定时相位约为-0.1,补偿后的相位在0附近波动,但由于没有进行环路滤波(可采用卡尔曼滤波器),所以波动很大,这也导致了后续解调结果不理想,实际中必须加入滤波器…

Java 10迁移建议

你好&#xff0c;再一次到另一个热点。 我的名字是Java Champions平台工程师兼DevOps专家Peter Pilgrim。 如您所知&#xff0c;Java 9引入了模块系统。 您可能正在将服务迁移到JDK 10或更高版本&#xff0c;或者至少在考虑中。 我对企业的一般建议是&#xff0c;您越早迁移&a…

《调制解调算法》专栏导航贴

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 通信方面有关信号处理算法的MATLAB仿真&#xff0c;包含博主的一些宝贵经验&#xff0c;不定期更新&#xff01;&#xff01;&#xff01; 本系列博克力求从简到繁&#xff0c;无论是刚接触通信的小白&…

Office系列完全干净卸载工具合集(最全)

使用 Microsoft Fix it 卸载 Microsoft Office 套件 一、Windows 7、Windows Vista或Windows XP下卸载Office 1.MicrosoftEasyFix50416 工具用来卸载office 2003 MicrosoftEasyFix50416_Office2003.msi 2.MicrosoftEasyFix50154 工具用来卸载office 2007 MicrosoftEasyFix50…

谓词::不适合Java

Jim Laskey在OpenJDK core-libs-dev邮件列表上最近的消息“ RFR&#xff1a;CSR – JDK-8203428 Predicate :: not ”指出了JDK Bug JDK-8203428 [“ Predicate :: not”]。 JDK-8203428的“摘要”指出&#xff1a;“引入新的静态方法Predicate :: not&#xff0c;这将使开发人…

缓冲区溢出漏洞攻击之用户登录

登录程序模拟 在以下程序中,可以使用三种不同的方法检查用户输入的账号和密码是否与存储的用户名和密码匹配。通过编译生成可执行文件,并对其进行测试。该程序会将用户输入的账号、密码与名为password.txt的文件中的账号、密码进行比对,如果二者匹配,则授予访问权限。而实…

【锁相环系列1】锁相环的基本原理

关注公号【逆向通信猿】更精彩!!! 基本概念 相位同步 指两个信号的频率相等,相位差为一个固定值。当 ω i = ω 0 \omega_i=\omega_0 ω

【锁相环系列2】数字判决反馈环之BPSK信号解调MATLAB仿真(含环路滤波器参数设置)

关注公号【逆向通信猿】更精彩!!! 仿真结果 频偏补偿之前的星座图,是一个“环”。 频偏补偿后的BPSK信号星座图 解调误码率曲线 <

hadoop emr_在Amazon EMR上运行Hadoop MapReduce作业

hadoop emr不久前&#xff0c;我发布了如何使用CLI设置EMR群集的信息。 在本文中&#xff0c;我将展示如何使用适用于AWS的Java SDK来设置集群。 展示如何使用Java AWS开发工具包执行此操作的最佳方法是展示我认为完整的示例&#xff0c;因此让我们开始吧。 设置一个新的Maven…

Apache Spark中的自定义日志

您是否曾经对运行了几个小时的Spark作业感到沮丧&#xff0c;但由于基础设施问题而失败了。 您会很晚才知道此故障&#xff0c;并浪费了数小时的时间&#xff0c;当Spark UI日志也无法用于事后检查时&#xff0c;它会更加痛苦。 你不是一个人&#xff01; 在这篇文章中&…

【MFC系列1】之简单Win32程序

一、位运算 标志位组合&#xff1a;wParam MK_RBUTTON|MK_CONTROL|MK_SHIFT 标志位的判断&#xff1a;wParam & MK_LBUTTON 标志位的分离&#xff1a;wParam & ~MK_RBUTTON; 二、调用约定 __cdecl_stdcall是C Declaration的缩写&#xff08;declaration&#xff0c…

【MFC系列2】Win32项目转换为MFC项目

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 一、MFC的组成 a)必须有一个CWinApp的派生类&#xff1b; b)必须用派生类在全局定义一个对象theApp; c)在派生类中必须重写InitInstance虚函数&#xff1b; d)MFC程序就用CWinApp派生类中的InitInstance虚…

servlet面试常问问题_50个Servlet面试问答

servlet面试常问问题Servlet是Java EE的一个非常重要的主题&#xff0c;所有Web应用程序框架&#xff08;例如Spring和Struts&#xff09;都建立在它之上。 这使servlet成为Java访谈中的热门话题。 在这里&#xff0c;我提供了50个servlet面试问题的列表&#xff0c;并提供了答…

Win10图片查看器打不开图片,报错内存不足

关注公号【逆向通信猿】更精彩&#xff01;&#xff01;&#xff01; 按如下设置即可

学习Java的最佳方法

Java是某些人可能会说很难学习的语言之一&#xff0c;而其他人则认为它与其他语言具有相同的学习曲线。 两种观察都是正确的。 但是&#xff0c;由于Java具有平台无关性&#xff0c;因此在语言方面具有相当大的优势。 Java是一种低级语言&#xff0c;它以一种简单的方式来实现…