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)------数据处理技巧相关推荐

  1. 大数据分析必须要会的数据处理技巧!!!

    文章目录 数值类型转换 属性类型转换 使用Pandas 工具包可以处理千万级别的数据量,但读取过于庞大的数据特征时,经常会遇到内存溢出等问题.估计绝大多数读者使用的笔记本电脑都是8GB内存,没关系,这 ...

  2. 效率倍增!12 个必知必会的 Python 数据处理技巧!

    目前 Python 已经成为最受欢迎的程序设计语言之一.由于 Python 语言的简洁性.易读性以及可扩展性,用 Python 做科学计算的研究机构日益增多,很多知名大学已经采用 Python 来教授 ...

  3. 数据处理技巧(2):excel处理txt数据,加正负号±统一数据字符长度

    概括: excel以表格形式打开txt文本,为每个数据设置正负号并且采用科学计数法的形式,最终得到每个数据的字符长度相同的结果. 用途: 便于其他程序读取TXT中数据时候,一次性读取多少个字符,比较好 ...

  4. 「Excel技巧」Excel技巧之如何看文件里的宏?

    「Excel技巧」Excel技巧之如何看文件里的宏? 在excel里打开一个文件,进入View这个菜单里,然后如下图示,找到Macros图标, 点击菜单'View Macros', 进入如下界面,就能 ...

  5. VGG16、VGG19网络架构及模型训练 tricks :训练技巧、测试技巧

    在上一篇文章的基础之上,总结一下论文中提出的训练技巧和测试技巧.上一篇文章参考:VGG论文笔记--VGGNet网络架构演变[VGG16,VGG19] 一.训练技巧 技巧1:Scale jitterin ...

  6. python 梦幻西游手游脚本_梦幻西游手游抢怪有什么技巧 梦幻西游抢怪技巧

    今天小编为大家带来了梦幻西游手游抢怪有什么技巧 梦幻西游抢怪技巧,感兴趣的朋友们可以跟着小编去下文了解一下哦! 游戏中的资源就在那里不多不少,你抢或不抢都随你,但是你能得多少就不能随你啦!在游戏中抢怪 ...

  7. 数据处理奇技巧——python数据处理小技能

    有人说做数据无非几点:逻辑思路,技术工具和业务需求,1)逻辑思路中涵盖的大多是一些算法.规则: 2)技术工具中主要是python.Excel和SQL: 3)业务逻辑里面则多为一些指标.客群等. 看着很 ...

  8. 算法与实战 - 常见的数据处理技巧

    文章目录 1. 缺失值与异常值 1.1 缺失值处理 1.2 异常值处理 2. 数据转换 2.1 衍生变量 2.2 改变变量分布 2.3 分箱转换 2.4 数据归一化 3. 共线性问题 3.1 识别共线 ...

  9. excel这几大数据处理技巧,高效率操作技能,今天免费交给你!

    我们在工作的时候一般都活用到excel这些操作技巧,所以我们在工作的时候一般都是利用一些操作技巧去进行操作的,操作起来一般都比较简单,但是如果使用一些操作公式的话就有点难度了,好多人都不知道如何去使用 ...

最新文章

  1. 封装成vla函数_不知道怎么封装代码?看看这几种设计模式吧!
  2. ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引
  3. python【蓝桥杯vip练习题库】ALGO-120 学做菜
  4. 计算机一级在线解析,2014年计算机一级考试MSOffice第三章考点解析 18
  5. 30年传奇 侯为贵留下的荣耀和遗憾
  6. 数据分析学习笔记——数据可视化
  7. OpenDDS用idl生成自定义数据类型时遇到的一个问题
  8. 机器学习之朴素贝叶斯算法原理
  9. AAAI 2021 | 视频超分中的可变形对齐解读
  10. jq如何获取选中option的值_如何用jQuery获得select的值
  11. LINUX其他重要服务
  12. js获取文件的后缀名
  13. 习题4-6 莫尔斯代码(Morse Mismatches,ACM/ICPC World Finals 1997,UVa508)
  14. 论文解读:FASPell: A Fast, Adaptable, Simple, Powerful Chinese Spell Checker Based On DAE-Decoder Paradig
  15. uniapp得到用户当前定位以及用户选择位置
  16. excel 一列的数据除以另一列
  17. 1:STM32CubeMX配置STM32F103C8T6驱动-下载软件配置RCC,CAN1,USART1
  18. Druid数据库连接池监控的使用
  19. 模拟Vista侧边栏的CPU仪表盘(VC6)
  20. Spring第一章笔记

热门文章

  1. 免费的java外文文献,JAVA外文文献翻译[共18页].doc
  2. adblock过滤规则编写
  3. 杰理6905A芯片引脚的设置
  4. ipad下添加126邮箱账户
  5. 淘宝皇冠卖家过劳死 大家一定要劳逸结合啊,别太拼命啦
  6. c语言输入一元二次方程三个系数,C语言程序 一元二次方程
  7. clickhouse多副本
  8. 判断指定日期为当年第几天(Java实现)
  9. 无域名HTTP请求攻击分析
  10. GMAN: A Graph Multi-Attention Network for Traffic Prediction(2020AAAI)