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

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)如何更改该流操作的结果。

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

java streams

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

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

相关文章

算法提高 日期计算c语言,算法提高 日期计算

//规定年份2017年1月1日 星期7#includeusing namespace std;int rn(int n) //判断是否是润年{if (n%40 && n%100!0 || n%4000)return 1;return 0;}int md[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};int main(){int year,month,day;int i,sum0,td0;while (cin>>…

IntelliJ IDEA for Mac 模块源文件的编译输出路径配置

按下组合键 Command ; 打开【项目结构】窗口&#xff0c;接着在左侧菜单栏中选择【Modules】&#xff0c;接着在右侧模块列表中选择要设置的模块&#xff0c;接着选择右侧的【Paths】标签&#xff0c;如下图所示&#xff1a; 不知道搞个【test ouput path】的好处在哪里&…

IntelliJ IDEA for Mac 如何在当前的普通Java项目中创建新的模块/添加模块/创建模块

文章目录添加模块的入口创建新的项目模块添加模块的入口 添加新的模块的入口有两个&#xff0c;如下图所示&#xff1a; 第一种方式&#xff0c;【File】 --> 【New】 --> 【Module】&#xff1a; 第二种方式&#xff0c;打开【Project Structure】窗口&#xff0c;然后…

react api_使用Java EE 8中的React式API加速服务

react api服务通常可以通过异步处理进行优化&#xff0c;即使不改变其对外界的行为。 某些服务效率不高的原因是&#xff0c;它们需要等待其他服务提供结果才能继续下去。 让我们看一下如何在不等待外部REST服务的情况下调用它们&#xff0c;并独立进行多个并行调用&#xff…

android申请权限一次性申请多个,android 6.0以上动态一次申请多个权限-最美解决方案...

目录背景危险权限申请权限思路申请权限流程干货后续一.背景android23 API新增危险权限校验&#xff0c;需要手动获取&#xff1a;二.危险权限&#xff1a;日历数据android.permission-group.CALENDARandroid.permission.READ_CALENDARandroid.permission.WRITE_CALENDAR相机and…

IntelliJ IDEA for Mac 直接将模块硬盘上的根目录删除会怎么样

不通过 IDEA 删除模块文件&#xff0c;而是直接手动从硬盘删除模块文件&#xff0c;造成的结果如下图所示&#xff1a; 【模块内容导航窗格】的内容是根据以下两个配置文件的信息从硬盘中加载进来的&#xff1a; 项目根目录/.idea/modules.xml 这个文件记载了配置文件【模块名…

java 谓词_谓词::不适合Java

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;这将…

android root权限函数,android 4.4下app永久获取root权限的方法

本帖最后由 jackson 于 2017-4-16 20:55 编辑通过参照[FAQ11414]android KK 4.4 版本后&#xff0c;user 版本su 权限严重被限制问题说明http://www.voidcn.com/blog/wds1181977/article/p-6157006.html明确要修改三个地方&#xff1a;(1)把dalvik/vm/native/dalvik_system_Zyg…

IntelliJ IDEA 项目开发中各个目录的关系

项目根目录&#xff08;Project Root&#xff09;&#xff1a;本地硬盘中存放项目内容的根目录 项目名称&#xff08;Project Name&#xff09;&#xff1a;IDEA 保存的项目名称&#xff0c;默认和项目根目录的名称相同&#xff0c;可以修改。有啥作用&#xff1f;通过 IDEA 部…

apache spark_Apache Spark中的自定义日志

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

android中暂停服务,Android 装逼技术之暗码启动应用

前言喜欢的小伙伴欢迎关注&#xff0c;我会定期分享Android知识点及解析&#xff0c;还会不断更新的BATJ面试专题&#xff0c;欢迎大家前来探讨交流&#xff0c;如有好的文章也欢迎投稿。什么是暗码&#xff1f;在拨号盘中输入*#*##*#*后&#xff0c;APP 可以监控到这些输入&am…

JShell 详解

文章目录一、简介二、为什么使用 JShell三、参考示例启动 JShell退出 JShell声明定义基本类型的变量声明定义一个方法覆盖已存在的变量、方法、类的定义查看 JShell 默认导入的包自动补全功能列出所有键入的源列出已声明方法及其签名加载外部的源代码查看 JShell 提供的所有指令…

graphql_GraphQL在Wildfly群上

graphql“ GraphQL是API的查询语言&#xff0c;是用于使用现有数据完成这些查询的运行时。 GraphQL为您的API中的数据提供了完整且易于理解的描述&#xff0c;使客户能够准确地询问他们所需的内容&#xff0c;仅此而已&#xff0c;使随着时间的推移更容易开发API并启用强大的开…

android中有哪些utils的作用,AndroidUtils

多年开发Android积攒下来好多常用的工具方法&#xff0c;保存在随笔中&#xff0c;持续更新。TimeUtil/*** 获取距当前时刻的时间戳** param createTime* return*/public static String getTimestamp(long createTime) {long currrentMillis System.currentTimeMillis();// if…

Java中的关键字this_super

文章目录要点错误的理解正确的理解演示代码要点 1.在类的构造器中&#xff0c;可以使用 this() 调用本类的其它构造器&#xff0c;调用的时候根据构造器声明的参数列表传递参数值 2.super() 调用父类的无参构造器 3.super.method() 调用父类的 method() 方法 4.super.name …

Spring Hibernate教程

1.简介 在本文中&#xff0c;我们将演示如何利用最流行的ORM&#xff08;对象关系映射&#xff09;工具之一的Hibernate的功能 &#xff0c;该工具可将面向对象的域模型转换为传统的关系数据库。 Hibernate是目前最流行的Java框架之一。 由于这个原因&#xff0c;我们在Java Co…

百度地图瓦片 android,百度地图自定义瓦片图获取

nodejs代码const request require(request);const fs require(fs);const bagpipe require(bagpipe);const TileLnglatTransform require(tile-lnglat-transform);let [x1, y1] [72.26, 54.57]; // 起始点坐标(左上角)let [x2, y2] [137.31, 17.8]; // 终点坐标(右下角)le…

IntelliJ IDEA for Mac 如何自定义快捷键_设置快捷键

文章目录设置代码补全快捷键设置展开全部的快捷键折叠全部快捷键设置代码补全快捷键 代码自动补全&#xff0c;即智能提示。 打开【系统偏好设置】如下图所示&#xff1a; 在左侧的菜单栏中找到 Keymap → Main Menu → Code → Code Completion → Basic&#xff1a; 设…

android8 老手机,华为多款老旧手机获升安卓8.0,流畅度飙升!

原标题&#xff1a;华为多款老旧手机获升安卓8.0&#xff0c;流畅度飙升&#xff01;一直以来&#xff0c;在手机用户圈都有这么一个共识&#xff0c;那就是安卓手机不如iPhone流畅&#xff0c;之前安卓手机给人的印象就是容易卡顿&#xff0c;而谷歌则一直在为此事苦恼&#x…

java12关键字var_Java 10:“ var”关键字

java12关键字varJava 10使用关键字var引入了局部变量类型推断 。 这意味着无需编写&#xff1a; Map<Department, List<Employee>> map new HashMap<>(); // ... for (Entry<Department, List<Employee>> dept : map.entrySet()) {List<Emp…