Stream使用技巧(1)------数据处理技巧
Stream使用技巧(1)------数据处理技巧
一. 背景
作为java8新特性之一的Stream API
为开发者带来了极大的便利,它可以对我们需要操作的集合进行非常复杂的操作,以活的我们想要的结果.
本文不会告诉你什么是Stream,毕竟网上花里胡哨的使用教程已经让我应接不暇,本系列博文只是记录一些Stream
的使用技巧,便于方便的查找和参考.
本博文会无限更新,有新的使用方法会逐渐添加进来,如果有小伙伴有新奇的使用技巧,也可以发出来一起分享.
本文中默认使用的对象user如下:
@Dataclass User {/** 名字 **/private String name;/** 年龄 **/private Integer age;/** 性别 true男false女 **/private boolean sex;User(String name, Integer age, boolean sex) {this.age = age;this.name = name;this.sex = sex;}}
二. 使用案例
1. List<User>转Map<String, Integer>
需求描述:
有一个List集合,其中的每一个元素都是对象,想变成一个Map,其中key是对象的一个属性,value也是对象的一个属性或者对象本身.
伪代码:
@Testpublic void test1() {User a = new User("张三", 20, true);User b = new User("李四", 30, true);User c = new User("王五", 40, true);List<User> list = new ArrayList<User>();list.add(a);list.add(b);list.add(c);//变成Map, key是name, value是ageMap<String, Integer> collect = list.stream().collect(Collectors.toMap(User::getName, User::getAge));System.out.println(collect);}
结果:
{李四=30, 张三=20, 王五=40}
2. List<User>转List<String>
需求描述:
List对象中,提取出每一个User对象的name属性,放在List里面
伪代码:
@Testpublic void test1() {User a = new User("张三", 20, true);User b = new User("李四", 30, true);User c = new User("王五", 40, true);List<User> list = new ArrayList<User>();list.add(a);list.add(b);list.add(c);//取出每一个user的name变成listList<String> collect = list.stream().map(User::getName).collect(Collectors.toList());System.out.println(collect);}
结果:
[张三, 李四, 王五]
3. List<User>转Map<Integer, Map<String, User>>
需求描述
用户集合中的用户,先按照年龄分组,再按照姓名分组,最终将用户分开
伪代码:
@Testpublic void test1() {User a = new User("张三", 20, true);User b = new User("李四", 30, true);User c = new User("王五", 40, true);User d = new User("花木兰", 40, false);User e = new User("李师师", 50, false);List<User> list = new ArrayList<User>();list.add(a);list.add(b);list.add(c);list.add(d);list.add(e);//取出每一个user的name变成listMap<Integer, Map<String, User>> collect =list.stream().collect(Collectors.groupingBy(User::getAge,Collectors.toMap(User::getName, x -> x)));System.out.println(collect);}
结果:
{50={李师师=SampleStream.User(name=李师师, age=50, sex=false)}, 20={张三=SampleStream.User(name=张三, age=20, sex=true)}, 40={王五=SampleStream.User(name=王五, age=40, sex=true), 花木兰=SampleStream.User(name=花木兰, age=40, sex=false)}, 30={李四=SampleStream.User(name=李四, age=30, sex=true)}}
4. List<User>取出一个属性转List<Integer>, 并去重
需求描述
取出用户集合中的Age字段,放在一个List中,并去重
伪代码:
@Testpublic void test1() {User a = new User("张三", 20, true);User b = new User("李四", 30, true);User c = new User("王五", 40, true);User d = new User("花木兰", 40, false);User e = new User("李师师", 50, false);List<User> list = new ArrayList<User>();list.add(a);list.add(b);list.add(c);list.add(d);list.add(e);//取出每一个user的name变成listList<Integer> collect = list.stream().map(User::getAge).distinct().collect(Collectors.toList());System.out.println(collect);}
结果:
[20, 30, 40, 50]
5. List<User>去重并提出空值
需求描述
用户集合中有两个用户是相同的,且有个null对象,需要得到一个去重去空后的集合
伪代码:
@Testpublic void test1() {User a = new User("张三", 20, true);User b = new User("李四", 30, true);User c = new User("王五", 40, true);User d = new User("王五", 40, false);User e = new User("李师师", 50, false);List<User> list = new ArrayList<User>();list.add(a);list.add(b);list.add(c);list.add(d);list.add(e);list.add(null);System.out.println("去重前: " + list);//取出每一个user的name变成listArrayList<User> collect = list.stream().filter(Objects::nonNull).collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getName))),ArrayList::new));System.out.println("去重后: " + collect);}
结果:
去重前: [SampleStream.User(name=张三, age=20, sex=true), SampleStream.User(name=李四, age=30, sex=true), SampleStream.User(name=王五, age=40, sex=true), SampleStream.User(name=王五, age=40, sex=false), SampleStream.User(name=李师师, age=50, sex=false), null] 去重后: [SampleStream.User(name=张三, age=20, sex=true), SampleStream.User(name=李四, age=30, sex=true), SampleStream.User(name=李师师, age=50, sex=false), SampleStream.User(name=王五, age=40, sex=true)]
结语:
在本篇博文中,列举了java8中Stream API在实际开发中的一些应用技巧,记录在这里,以后有需要的时候可以及时查阅
个人公众号<橙耘自留地>日前已经开通,后续博主发布的文章都会一并更新到公众号,如有需要,自行查阅.
关于橙耘自留地,是我个人聚焦互联网技术栈学习分享的一个平台,创立之初是因为目前业内各种技术课程资料层次不齐,褒贬不一,有时候一门课花费高价买入,其实内含草包,有时偶尔低价得之,却又大有干货.因此我会根据大家的意见和评价,选择不同的技术栈去学习,一为提升我自己的技术,二为大家梳理出质量比较好的课程,以作参考.同时,相关的学习心得也会一并更新到博客和公众号.
Stream使用技巧(1)------数据处理技巧相关推荐
- 大数据分析必须要会的数据处理技巧!!!
文章目录 数值类型转换 属性类型转换 使用Pandas 工具包可以处理千万级别的数据量,但读取过于庞大的数据特征时,经常会遇到内存溢出等问题.估计绝大多数读者使用的笔记本电脑都是8GB内存,没关系,这 ...
- 效率倍增!12 个必知必会的 Python 数据处理技巧!
目前 Python 已经成为最受欢迎的程序设计语言之一.由于 Python 语言的简洁性.易读性以及可扩展性,用 Python 做科学计算的研究机构日益增多,很多知名大学已经采用 Python 来教授 ...
- 数据处理技巧(2):excel处理txt数据,加正负号±统一数据字符长度
概括: excel以表格形式打开txt文本,为每个数据设置正负号并且采用科学计数法的形式,最终得到每个数据的字符长度相同的结果. 用途: 便于其他程序读取TXT中数据时候,一次性读取多少个字符,比较好 ...
- 「Excel技巧」Excel技巧之如何看文件里的宏?
「Excel技巧」Excel技巧之如何看文件里的宏? 在excel里打开一个文件,进入View这个菜单里,然后如下图示,找到Macros图标, 点击菜单'View Macros', 进入如下界面,就能 ...
- VGG16、VGG19网络架构及模型训练 tricks :训练技巧、测试技巧
在上一篇文章的基础之上,总结一下论文中提出的训练技巧和测试技巧.上一篇文章参考:VGG论文笔记--VGGNet网络架构演变[VGG16,VGG19] 一.训练技巧 技巧1:Scale jitterin ...
- python 梦幻西游手游脚本_梦幻西游手游抢怪有什么技巧 梦幻西游抢怪技巧
今天小编为大家带来了梦幻西游手游抢怪有什么技巧 梦幻西游抢怪技巧,感兴趣的朋友们可以跟着小编去下文了解一下哦! 游戏中的资源就在那里不多不少,你抢或不抢都随你,但是你能得多少就不能随你啦!在游戏中抢怪 ...
- 数据处理奇技巧——python数据处理小技能
有人说做数据无非几点:逻辑思路,技术工具和业务需求,1)逻辑思路中涵盖的大多是一些算法.规则: 2)技术工具中主要是python.Excel和SQL: 3)业务逻辑里面则多为一些指标.客群等. 看着很 ...
- 算法与实战 - 常见的数据处理技巧
文章目录 1. 缺失值与异常值 1.1 缺失值处理 1.2 异常值处理 2. 数据转换 2.1 衍生变量 2.2 改变变量分布 2.3 分箱转换 2.4 数据归一化 3. 共线性问题 3.1 识别共线 ...
- excel这几大数据处理技巧,高效率操作技能,今天免费交给你!
我们在工作的时候一般都活用到excel这些操作技巧,所以我们在工作的时候一般都是利用一些操作技巧去进行操作的,操作起来一般都比较简单,但是如果使用一些操作公式的话就有点难度了,好多人都不知道如何去使用 ...
最新文章
- 封装成vla函数_不知道怎么封装代码?看看这几种设计模式吧!
- ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引
- python【蓝桥杯vip练习题库】ALGO-120 学做菜
- 计算机一级在线解析,2014年计算机一级考试MSOffice第三章考点解析 18
- 30年传奇 侯为贵留下的荣耀和遗憾
- 数据分析学习笔记——数据可视化
- OpenDDS用idl生成自定义数据类型时遇到的一个问题
- 机器学习之朴素贝叶斯算法原理
- AAAI 2021 | 视频超分中的可变形对齐解读
- jq如何获取选中option的值_如何用jQuery获得select的值
- LINUX其他重要服务
- js获取文件的后缀名
- 习题4-6 莫尔斯代码(Morse Mismatches,ACM/ICPC World Finals 1997,UVa508)
- 论文解读:FASPell: A Fast, Adaptable, Simple, Powerful Chinese Spell Checker Based On DAE-Decoder Paradig
- uniapp得到用户当前定位以及用户选择位置
- excel 一列的数据除以另一列
- 1:STM32CubeMX配置STM32F103C8T6驱动-下载软件配置RCC,CAN1,USART1
- Druid数据库连接池监控的使用
- 模拟Vista侧边栏的CPU仪表盘(VC6)
- Spring第一章笔记