Stream操作Collection集合

独立使用 Stream 的步骤如下:

1 . 使用 Stream 或 XxxStream 的 builder() 类方法创建该 Stream 对应的 Builder。

2 . 重复调用 Builder 的 add() 方法向该流中添加多个元素。

3 . 调用 Builder 的 build() 方法获取对应的 Stream。

4 . 调用 Stream 的聚集方法。

Stream 提供了大量的聚集方法供用户调用。对于大部分聚集方法而言,每个 Stream 只能执行一次。例如如下程序。

public class IntStreamTest {public static void main(String[] args) {IntStream is = IntStream.builder().add(20).add(13).add(-2).add(18).build();// 下面调用聚集方法的代码每次只能执行一行System.out.println("is 所有元素的最大值:" + is.max().getAsInt());System.out.println("is 所有元素的最小值:" + is.min().getAsInt());System.out.println("is 所有元素的总和:" + is.sum());System.out.println("is 所有元素的总数:" + is.count());System.out.println("is 所有元素的平均值:" + is.average());System.out.println("is所有元素的平方是否都大于20: " + is.allMatch(ele -> ele * ele > 20));System.out.println("is是否包含任何元素的平方大于20 : " + is.anyMatch(ele -> ele * ele > 20));// 将is映射成一个新Stream,新Stream的每个元素是原Stream元素的2倍+1IntStream newIs = is.map(ele -> ele * 2 + 1);// 使用方法引用的方式来遍历集合元素newIs.forEach(System.out::println); // 输岀 41 27 -3 37}
}

上面程序先创建了一个 IntStream,接下来分别多次调用 IntStream 的聚集方法执行操作,这样即可获取该流的相关信息。

注意:上面 5~13 行代码每次只能执行一行,因此需要把其他代码注释掉。

Stream 提供了大量的方法进行聚集操作,这些方法既可以是“中间的”(intermediate),也可以是 “末端的”(terminal)。

中间方法:中间操作允许流保持打开状态,并允许直接调用后续方法。上面程序中的 map() 方法就是中间方法。中间方法的返回值是另外一个流。

末端方法:末端方法是对流的最终操作。当对某个 Stream 执行末端方法后,该流将会被“消耗”且不再可用。上面程序中的 sum()、count()、average() 等方法都是末端方法。

除此之外,关于流的方法还有如下两个特征。

有状态的方法:这种方法会给流增加一些新的属性,比如元素的唯一性、元素的最大数量、保证元素以排序的方式被处理等。有状态的方法往往需要更大的性能开销。

短路方法:短路方法可以尽早结束对流的操作,不必检查所有的元素。

Stream 常用的中间方法。

方法说明
filter(Predicate predicate)过滤 Stream 中所有不符合 predicate 的元素
mapToXxx(ToXxxFunction mapper)使用 ToXxxFunction 对流中的元素执行一对一的转换,该方法返回的新流中包含了 ToXxxFunction 转换生成的所有元素。
peek(Consumer action)依次对每个元素执行一些操作,该方法返回的流与原有流包含相同的元素。该方法主要用于调试。
distinct()该方法用于排序流中所有重复的元素(判断元素重复的标准是使用 equals() 比较返回 true)。这是一个有状态的方法。
sorted()该方法用于保证流中的元素在后续的访问中处于有序状态。这是一个有状态的方法。
limit(long maxSize)该方法用于保证对该流的后续访问中最大允许访问的元素个数。这是一个有状态的、短路方法。

Stream 常用的末端方法。

方法说明
forEach(Consumer action)遍历流中所有元素,对每个元素执行action
toArray()将流中所有元素转换为一个数组
reduce()该方法有三个重载的版本,都用于通过某种操作来合并流中的元素
min()返回流中所有元素的最小值
max()返回流中所有元素的最大值
count()返回流中所有元素的数量
anyMatch(Predicate predicate)判断流中是否至少包含一个元素符合 Predicate 条件。
allMatch(Predicate predicate)判断流中是否每个元素都符合 Predicate 条件
noneMatch(Predicate predicate)判断流中是否所有元素都不符合 Predicate 条件
findFirst()返回流中的第一个元素
findAny()返回流中的任意一个元素

Collection 接口提供了一个 stream() 默认方法,该方法可返回该集合对应的流,接下来即可通过流式 API 来操作集合元素。由于 Stream 可以对集合元素进行整体的聚集操作,因此 Stream 极大地丰富了集合的功能。

使用 Stream 直接对集合中所有的元素进行批量操作。下面使用 Stream 来改写这个程序。

public class CollectionStream {public static void main(String[] args) {// 创建一个集合Collection objs = new HashSet();objs.add(new String("中文百度搜索Java教程"));objs.add(new String("中文百度搜索C++教程"));objs.add(new String("中文百度搜索C语言教程"));objs.add(new String("中文百度搜索Python教程"));objs.add(new String("中文百度搜索Go教程"));// 统计集合中出现“中文百度搜索”字符串的数量System.out.println(objs.stream().filter(ele -> ((String) ele).contains("中文百度搜索")).count()); // 输出 5// 统计集合中出现“Java”字符串的数量System.out.println(objs.stream().filter(ele -> ((String) ele).contains("Java")).count()); // 输出 1// 统计集合中出现字符串长度大于 12 的数量System.out.println(objs.stream().filter(ele -> ((String) ele).length() > 12).count()); // 输出 1// 先调用Collection对象的stream ()方法将集合转换为Stream// 再调用Stream的mapToInt()方法获取原有的Stream对应的IntStreamobjs.stream().mapToInt(ele -> ((String) ele).length())// 调用forEach()方法遍历IntStream中每个元素.forEach(System.out::println);// 输出 11 11 12 10 14}
}

输出结果为:

5    1    1    11    11    12    10    14

从上面代码第 11~20 行可以看出,程序只要调用 Collection 的 stream() 方法即可返回该集合对应的 Stream,接下来就可通过 Stream 提供的方法对所有集合元素进行处理,这样大大地简化了集合编程的代码,这也是 Stream 编程带来的优势。

上面程序中第 18 行代码先调用 Collection 对象的 stream() 方法将集合转换为 Stream 对象,然后调用 Stream 对象的 mapToInt() 方法将其转换为 IntStream 这个 mapToInt。方法就是一个中间方法,因此程序可继续调用 IntStream 的 forEach() 方法来遍历流中的元素。

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

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

相关文章

Logistic回归——二分类 —— python

目录 1.简介 2.应用范围 3.分类 3.应用条件 4.原理详解 4.1 sigmod分类函数 4.2 建立目标函数 4.3 求解相关参数 5.实列分析 5.1 导入库 5.2 读取数据(excel文件) 5.3 分离数据集 5.4 求解前设定 5.5 求解目标函数 5.6 预测 5.7 预测分类…

dubbo官方文档_狂神说SpringBoot17:Dubbo和Zookeeper集成

狂神说SpringBoot系列连载课程,通俗易懂,基于SpringBoot2.2.5版本,欢迎各位狂粉转发关注学习。未经作者授权,禁止转载分布式理论什么是分布式系统?在《分布式系统原理与范型》一书中有如下定义:“分布式系统…

第一个脚本-HelloWorld

目录 前言 脚本的作用 创建脚本 开始编写我们这次的HelloWorld的对话框 前言 我的扩展主要使用:Tampermonkey,当然其他的有类似功能的也可以,我们就将这些统称为油猴吧。 本节主要内容: 描述脚本的作用和油猴,脚本的基本结构,创建一个脚本,使它能够…

bme280 环境传感器开发板_STM32Cube14 | 使用硬件I2C读写环境光强度传感器

更多精彩~点击上面蓝字关注我们呀! 寻求更好的阅读体验,请点击阅读原文移步:Mculover666的个人博客。本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的硬件I2C外设读取环境光强度传感器数据(BH1750)。1. 准备工作硬件准备开发板首先…

Java查询图书信息

使用泛型集合来实现某图书管理系统的查询功能。 在图书管理系统中为了方便管理图书,将图书划分为几个类别。每个类别下有很多图书,每本图书都有相对应的类别,这就具备了一对多的关系映射,即一个类别对应多本图书。 在这种情况下…

平稳序列的拟合和预测之序列的预测

目录 1.线性预测函数 2.预测方差最小原则 3.线性最小方差预测的性质 AR(p)序列的预测 例题 R语言预测举例 MA(q)序列的预测 例题 ARMA(p,q)序列预测 例题 小结 序列只有为非白噪声时才可以进行预测哦!! 1.线性预测函数 根据平稳性和可逆性&…

python界面设计实例qt_pyqt的最小示例qtreeview和qt设计

我试图为qt设计器设计的应用程序获取一个最小的示例,其中pyqt涉及一个QTreeView 1)我可以用这种方式启动应用程序,但是如果我按下按钮,TreeView小部件中没有显示任何条目,我没有收到任何错误消息,布局看起来…

TypeError: ufunc ‘multiply‘ did not contain a loop with signature matching types dtype(‘S32‘) dtype(

目录 错误: 解决: 错误: TypeError: ufunc multiply did not contain a loop with signature matching types dtype(S32) dtype(S32) dtype(S32) 翻译:TypeError: ufunc multiply 不包含签名匹配类型 dtype(S32) dtype(S32) d…

Java一对多关系示例

生活中常见一对多关系的例子,如一个学校可以包含多个学生,一个学生属于一个学校,那么这就是一个典型的一对多关系,可以通过集合进行关系的表示。 1 . 定义学生类 import java.util.HashSet; import java.util.Iterator;public c…

vue 浏览器调试 样式如何定位样式_浏览器断点调试-程序员的必修课

一、源码调试/debugger方法1.1控制台调试按钮介绍Resume script execution恢复断点调试、常用在一个方法调用多个js文件(适用冗长js代码使用)、点击这个会直接跳转到下一个断点(逐过程执行)Pause script execution停止断点调试step over next function call逐语句执行&#xff…

Python: ufunc ‘bitwise_xor‘ not supported for the input types,....

错误: ufunc bitwise_xor not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule safe 原因: 错误使用 ^ 解决: 将使用的 ^ 全部改为 ** &#xff0c…

https open api_Web上的分享(Share)API

我认为Web Share API非常酷,简而言之,它会利用您所使用的平台上的原生共享功能(如果该平台支持的话)。我喜欢这个:远远不止这些东西:为什么?Web Share API只是几行代码。简单!没有图像,没有重量…

Java多对多关系示例

使用集合不仅可以表示一对一的关系,也可以表示多对多的关系。例如,一个学生可以选多门课程,一门课程可以有多个学生参加,那么这就是一个典型的多对多关系。 要完成上面要求,首先应该定义两个类,分别是学生…

无季节效应的非平稳序列分析(一)

目录 Cramer分解定理(1961年提出) 差分 R语言函数 diff 例题: 过差分: 小结 Cramer分解定理(1961年提出) 任何一个时间序列 都可以分解为两部分的叠加:其中一部分是由多项式决定的确定性趋势成分&a…

求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法

公元2020年5月5日,距离算法考试仅剩4天。一、知识归纳1.设计思想只根据当前已有的信息就做出选择,而且一旦做出了选择,将来无论如何都不能更改不从整体最优考虑,所做的选择只是在某种意义上的局部最优这种选择并不总能获得整体最优…

安装百分之80卡住_关注丨男子翻越高铁站台丢命,家属向铁路部门索赔80万!法院这样判...

去年3月,一名男子翻越高铁站台被卡住致死引发广泛关注。事发后,其家属将铁路部门告上法庭,索赔80余万元。日前,法院宣判:死者杨某擅自闯入危险区域负全责,其父母要求铁路部门赔偿的诉请被驳回。事件还原201…

ARIMA模型的介绍

目录 ARIMA模型结构 随机游走模型(random walk) 举例: ARIMA模型的性质 小结 ARIMA模型结构 使用场合:差分平稳序列拟合 模型结构 则有: 随机游走模型(random walk) 模型结构: Karl Pearson(1905)在《自然》杂志上提问:假…

java斗地主游戏

使用java实现斗地主小游戏。 程序分析: 1、创建扑克牌的实体类Poker,设置四个参数:花色、数字、牌值(判断大小)、是否地主牌,实现getset方法和构造方法; 2、创建玩家的实体类Player&#xff0…

为什么总是封板又打开涨停_警惕!如果股票涨停板反复打开说明了什么?

股市禁忌“三进三出”:“三进”为:一是“高位进”,这就是我们常说的追涨。犯有这种错误的投资者,喜欢在股票已经有了很大的涨幅后买进,其买进的依据往往是股票已经放量突破了历史高点或突破了某个高点阻力位等&#xf…

python中表示空类型的是_python中怎么表示空值

首先了解python对象的概念 python中,万物皆对象,所有的操作都是针对对象的。 那什么是对象?5是一个int对象,‘oblong是一个str对象,异常也是一个对象,抽象一点是,人,猫,够…