【JDK8新特性之Stream流-Stream结果收集案例实操】

news/2024/4/27 6:00:34/文章来源:https://blog.csdn.net/Coder_ljw/article/details/129200646

一.JDK8新特性之Stream流-Stream结果收集以及案例实操

在这里插入图片描述

二.Stream结果收集(collect函数)-实例实操

2.1 结果收集到集合中

	/*** Stream将结果收集到集合中以及具体的实现 collect*/@Testpublic void test01(){// 收集到List中   接口List<Integer> list = Stream.of(1, 2, 3,4).collect(Collectors.toList());System.out.println(list);// 收集到 Set集合中  接口Set<Integer> set = Stream.of(1, 2, 3,4).collect(Collectors.toSet());System.out.println(set);// 如果需要获取的类型为具体的实现,ArrayList HashSetArrayList<Integer> list1 = Stream.of(1, 2, 3,4)//.collect(Collectors.toCollection(() -> new ArrayList<>()));.collect(Collectors.toCollection(ArrayList::new));System.out.println(list1);//如果需要获取的类型为具体的实现,HashSetHashSet<Integer> set1 = Stream.of(1, 2, 3,4).collect(Collectors.toCollection(HashSet::new));System.out.println(set1);}

输出结果

在这里插入图片描述

2.2 结果收集到数组中

Stream中提供了toArray方法来将结果放到一个数组中,返回值类型是Object[],如果我们要指定返回的类型,那么可以使用另一个重载的toArray(IntFunction f)方法

/*** Stream结果收集到数组中*/@Testpublic void test02(){// 返回的数组中的元素是 Object类型Object[] objects = Stream.of("s1", "s2", "s3").toArray(); System.out.println(Arrays.toString(objects));// 如果我们需要指定返回的数组中的元素类型// 需要我们在toArray()方法中传入数组类型String[] strings = Stream.of("s1", "s2", "s3").toArray(String[]::new);System.out.println(Arrays.toString(strings));}

结果展示:
在这里插入图片描述

2.3 对流中的数据做聚合计算

​ 当我们使用Stream流处理数据后,可以像数据库的聚合函数一样对某个字段进行操作,比如获得最大值,最小值,求和,平均值,统计数量。

/*** Stream流中数据的聚合计算(最大值、最小值、求和、求平均值、满足条件的结果个数)*/@Testpublic void test03(){// 获取员工薪资的最大值Optional<Person> maxSalary = Stream.of(new Person("Jack", 3445), new Person("Tom", 4324), new Person("Meisi", 14353), new Person("Coroergo", 13425)).collect(Collectors.maxBy((p1, p2) -> p1.getSalary() - p2.getSalary()));System.out.println("最多薪资:" + maxSalary.get());// 获取员工薪资的最小值Optional<Person> minSalary = Stream.of(new Person("Jack", 3445), new Person("Tom", 4324), new Person("Meisi", 14353), new Person("Coroergo", 13425)).collect(Collectors.minBy((p1, p2) -> p1.getSalary() - p2.getSalary()));System.out.println("最少薪资:" + minSalary.get());// 求所有人员工薪资之和Integer sumSalary = Stream.of(new Person("Jack", 3445), new Person("Tom", 4324), new Person("Meisi", 14353), new Person("Coroergo", 13425)).collect(Collectors.summingInt(Person::getSalary));System.out.println("薪资总和:" + sumSalary);// 员工薪资的平均值Double avgSalary = Stream.of(new Person("Jack", 3445), new Person("Tom", 4324), new Person("Meisi", 14353), new Person("Coroergo", 13425)).collect(Collectors.averagingInt(Person::getSalary));System.out.println("薪资的平均值:" + avgSalary);// 员工薪资统计数量Long count = Stream.of(new Person("Jack", 3445), new Person("Tom", 4324), new Person("Meisi", 14353), new Person("Coroergo", 13425)).filter(p->p.getSalary() > 4000).collect(Collectors.counting());System.out.println("满足条件的记录数:" + count);}

结果展示
在这里插入图片描述

2.4 对流中数据做分组操作

当我们使用Stream流处理数据后,可以根据某个属性将数据分组

/*** 分组计算:按照我们是收入进行分组,分组的高收入组和低收入组*/@Testpublic void test04(){Map<String, List<Person>> map = Stream.of(new Person("Jack", 3445), new Person("Tom", 4324), new Person("Meisi", 14353), new Person("Coroergo", 13425)).collect(Collectors.groupingBy(p -> p.getSalary() >= 4000 ? "高收入" : "低收入"));map.forEach((k,v)-> System.out.println("k=" + k +"\t"+ "v=" + v));}

输出结果:

在这里插入图片描述

多级分组: 先根据name分组然后根据年龄分组

/*** 分组计算--多级分组(先按照姓名分组,然后再按照年龄分组)*/@Testpublic void test05(){Map<String,Map<Object,List<Person>>> map =  Stream.of(new Person("张三", 18, 175), new Person("李四", 22, 177), new Person("张三", 14, 165), new Person("李四", 15, 166), new Person("张三", 19, 182)).collect(Collectors.groupingBy(Person::getName,Collectors.groupingBy(p->p.getAge()>=18?"成年":"未成年")));map.forEach((k,v)->{System.out.println(k);v.forEach((k1,v1)->{System.out.println("\t"+k1 + "=" + v1);});});}

输出结果:
在这里插入图片描述

2.5 对流中的数据做分区操作

Collectors.partitioningBy会根据值是否为true,把集合中的数据分割为两个列表,一个true列表,一个false列表

/*** 分区操作*/@Testpublic void test06(){Map<Boolean, List<Person>> map = Stream.of(new Person("Jack", 3445), new Person("Tom", 4324), new Person("Meisi", 14353), new Person("Coroergo", 13425)).collect(Collectors.partitioningBy(p -> p.getSalary() > 6000));map.forEach((k,v)-> System.out.println(k+"\t" + v));}

输出结果:
在这里插入图片描述

2.6 对流中的数据做拼接

Collectors.joining会根据指定的连接符,将所有的元素连接成一个字符串

/*** 对流中的数据做拼接操作(对应着三种重载方法)*/@Testpublic void test07(){// 第一种拼接:直接拼接String s1 = Stream.of(new Person("Jack", 3445), new Person("Tom", 4324), new Person("Meisi", 14353), new Person("Coroergo", 13425)).map(Person::getName).collect(Collectors.joining());System.out.println(s1);// 第二种拼接:每个拼接中加"_"来进行连接String s2 = Stream.of(new Person("Jack", 3445), new Person("Tom", 4324), new Person("Meisi", 14353), new Person("Coroergo", 13425)).map(Person::getName).collect(Collectors.joining("_"));System.out.println(s2);// 第三种拼接:前后拼接加上"_",拼接的开始加上"--->",结束加上"<---"String s3 = Stream.of(new Person("Jack", 3445), new Person("Tom", 4324), new Person("Meisi", 14353), new Person("Coroergo", 13425)).map(Person::getName).collect(Collectors.joining("_", "--->", "<---"));System.out.println(s3);}

结果展示:
在这里插入图片描述

三.总结

人活着就在不停的做选择题,无论你做出了什么样的选择,我觉得都是你深思熟虑过后的答案,结果固然重要,但过程同样精彩,我是硕风和炜,我们下篇文章见哦!

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

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

相关文章

代码随想录【Day23】| 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接 题目描述&#xff1a; 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新…

Git ---- GitHub 操作

Git ---- GitHub 操作1. 创建远程仓库2. 远程仓库操作1. 创建爱你远程仓库别名2. 推送本地分支到远程仓库3. 克隆远程仓库到本地4. 邀请加入团队5. 拉取远程库内容3. 跨团队协作4. SSH 免密登录GitHub 网址&#xff1a;https://github.com/ Ps&#xff1a;全球最大同性交友网站…

makdown模版参考

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

RK系列(RK3568) i2s 音频输入 麦克风驱动

平台&#xff1a;Android12SOC&#xff1a;RK3568外围芯片&#xff1a;XS9922i2s简介&#xff1a;从上图看I2s主要的线有&#xff1a;SDO SCLK LRCK MCLK I2S协议只定义三根信号线&#xff1a;串行时钟信号SCLK(BCLK)、数据信号SD和左右声道选择信号WS。&#xff08;1&#xff…

Leetcode力扣秋招刷题路-0103

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此…

注意力机制详解系列(一):注意力机制概述

&#x1f468;‍&#x1f4bb;作者简介&#xff1a; 大数据专业硕士在读&#xff0c;CSDN人工智能领域博客专家&#xff0c;阿里云专家博主&#xff0c;专注大数据与人工智能知识分享。 &#x1f389;专栏推荐&#xff1a; 目前在写CV方向专栏&#xff0c;更新不限于目标检测、…

SSM+HTML搭建(小白教学)

最近做项目,觉得还是有意义记录以下前后端框架是怎么搭建的,今天给大家介绍介绍SSM:SpringBootSpringMVCMyBatis后端搭建:SpringBoot快速搭建的网站(Spring Initializr)选择创建之后,会下载到一个zip压缩包,对压缩包进行解压(包地址一般选择后端项目的放的文件夹中)用idea打开项…

上岸16K,薪资翻倍,在华为外包做测试是一种什么样的体验····

现在回过头看当初的决定&#xff0c;还是正确的&#xff0c;自己转行成功&#xff0c;现在进入了华为外包测试岗&#xff0c;脱离了工厂生活&#xff0c;薪资也翻了一倍不止。 我17年毕业于一个普通二本学校&#xff0c;电子信息工程学院&#xff0c;是一个很不出名的小本科。…

字符串匹配--strstr函数的模拟实现思路和代码

一&#xff0c;strstr函数 原型&#xff1a; const char * strstr ( const char * str1, const char * str2 );char * strstr ( char * str1, const char * str2 ); strstr是一个字符串匹配函数&#xff0c;在str1中去寻找str2&#xff0c;如果找到&#xff0c;返回str2在…

Tapdata Connector 实用指南:实时数仓场景之数据实时同步至 ClickHouse

【前言】作为中国的 “Fivetran/Airbyte”, Tapdata 是一个以低延迟数据移动为核心优势构建的现代数据平台&#xff0c;内置 60 数据连接器&#xff0c;拥有稳定的实时采集和传输能力、秒级响应的数据实时计算能力、稳定易用的数据实时服务能力&#xff0c;以及低代码可视化操作…

Tina_Linux_系统软件 开发指南

Tina_Linux_系统软件 开发指南 1 概述 编写目的&#xff1a;本文档作为Allwinner Tina Linux系统平台开发指南&#xff0c;旨在帮助软件开发工程师、技术支持工程师快速上手&#xff0c;熟悉Tina Linux系统的开发及调试流程。 适用范围&#xff1a;Tina Linux v3.5及以上版本…

博客管理系统--项目说明

项目体验地址&#xff08;账号&#xff1a;123&#xff0c;密码&#xff1a;123&#xff09;http://120.53.20.213:8080/blog_system/login.html项目码云Gitee地址&#xff1a;https://gitee.com/GoodManSS/project/tree/master/blog_system&#xff08;一&#xff09;准备工作…

常见前端基础面试题(HTML,CSS,JS)(三)

JS 中如何进行数据类型的转换&#xff1f; 类型转换可以分为两种&#xff0c;隐性转换和显性转换 显性转换 主要分为三大类&#xff1a;数值类型、字符串类型、布尔类型 三大类的原始类型值的转换规则我就不一一列举了 数值类型&#xff08;引用类型转换&#xff09; Numbe…

什么是SSL端口?HTTPS配置技术指南

安全套接字层&#xff08;SSL&#xff09;是负责互联网连接的数据身份验证和加密的技术。它加密在两个系统之间&#xff08;通常在服务器和客户端之间&#xff09;之间通过互联网发送的数据&#xff0c;使其保持私密。随着在线隐私的重要性日益增加&#xff0c;您应该熟悉SSL端…

「RISC-V Arch」SBI 规范解读(上)

术语 SBI&#xff0c;Supervisor Binary Interface&#xff0c;管理二进制接口 U-Mode&#xff0c;User mode&#xff0c;用户模式 S-Mode&#xff0c;Supervisor mode&#xff0c;监督模式 VS-Mode&#xff0c;Virtualization Supervisor mode&#xff0c;虚拟机监督模式 …

电商共享购模式,消费增值返利,app开发

在当今以市场需求为主导的数字经济时代&#xff0c;消费者需求呈现出精细化管理和多元化的特性&#xff0c;目标市场日渐完善&#xff0c;另外在大数据技术迅速进步和运用的驱动下&#xff0c;总体行业的发展节奏感也在不断加速。因而&#xff0c;企业需要建立一套灵活多变的经…

HyperGBM用Adversarial Validation解决数据漂移问题

本文作者&#xff1a;杨健&#xff0c;九章云极 DataCanvas 主任架构师 数据漂移问题近年在机器学习领域来越来越得到关注&#xff0c;成为机器学习模型在实际投产中面对的一个主要挑战。当数据的分布随着时间推移逐渐发生变化&#xff0c;需要预测的数据和用于训练的数据分布…

格雷码的实现

格雷码&#xff1a;任意两个相邻的二进制数之间只有一位不同 想必通信专业的学生应该都接触过格雷码&#xff0c;它出现在数电、通信原理等课程里。 如下图所示一个四位格雷码是什么样子的&#xff1a; 格雷码的特点&#xff1a; 其最大的特点是任意上下相邻的两个码值间&am…

线性数据结构:数组 Array

一、前言数组是数据结构还是数据类型&#xff1f;数组只是个名称&#xff0c;它可以描述一组操作&#xff0c;也可以命名这组操作。数组的数据操作&#xff0c;是通过 idx->val 的方式来处理。它不是具体要求内存上要存储着连续的数据才叫数组&#xff0c;而是说&#xff0c…

内网渗透(五十六)之域控安全和跨域攻击-非约束委派攻击

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…