文章目录

  • 前言
    • 一. 分组 groupingBy
      • 基础用法
        • 1. 按照某个属性分组
        • 2. 分组统计
        • 3. 分组求和
        • 4. 自定义分组条件------按姓名长度分组
        • 5. 自定义分组条件------按照多个字段分组
      • 高级用法
        • 1. 改变分组后的key和value
        • 2. 多级分组
        • 3. 我在项目中的使用例子

前言

刚开始我只会使用普通的for、while循环,最多就增强for循环,后来在项目上看到其他同事在用,看起来很新颖、简洁的样子,然后我也开始尝试使用,用顺手之后发现是真的香。在使用的过程中,有些时候,不能完全实现自己所想的,也没少百度,所以呢,就想着把这些稍微高级一点、难一点的用法记录下来,

数据准备:

public class BlogMain1 {@Data@AllArgsConstructorstatic class User{private String username;private String gender;private String group;private Integer age;}@Data@AllArgsConstructorstatic class Group {private String name;private String desc;}private List<User> users = new ArrayList<User>(){{add(new User("张无忌","男","明教",23));add(new User("金毛狮王--谢逊","男","明教",47));add(new User("紫衫龙王--黛绮丝","女","明教",32));add(new User("白眉鹰王--殷天正","男","明教",38));add(new User("青翼蝠王--韦一笑","男","明教",35));add(new User("张三丰","男","武当",56));add(new User("宋远桥","男","武当",42));add(new User("张翠山","男","武当",41));add(new User("殷梨亭","男","武当",37));add(new User("灭绝师太","女","峨眉",51));add(new User("周芷若","女","峨眉",21));add(new User("宋青书","男","峨眉",22));add(new User("圆真","男","少林",35));add(new User("空智","男","少林",47));}};
}

一. 分组 groupingBy

基础用法

1. 按照某个属性分组

 // key是门派名称,value是门派里面所有的人Map<String, List<User>> collect = users.stream().collect(Collectors.groupingBy(User::getGroup));// {武当=[BlogMain1.User(username=张三丰, gender=男, group=武当, age=56), BlogMain1.User(username=宋远桥, gender=男, group=武当, age=42), BlogMain1.User(username=张翠山, gender=男, group=武当, age=41), BlogMain1.User(username=殷梨亭, gender=男, group=武当, age=37)], 明教=[BlogMain1.User(username=张无忌, gender=男, group=明教, age=23), BlogMain1.User(username=金毛狮王--谢逊, gender=男, group=明教, age=47), BlogMain1.User(username=紫衫龙王--黛绮丝, gender=女, group=明教, age=32), BlogMain1.User(username=白眉鹰王--殷天正, gender=男, group=明教, age=38), BlogMain1.User(username=青翼蝠王--韦一笑, gender=男, group=明教, age=35)], 峨眉=[BlogMain1.User(username=灭绝师太, gender=女, group=峨眉, age=51), BlogMain1.User(username=周芷若, gender=女, group=峨眉, age=21), BlogMain1.User(username=宋青书, gender=男, group=峨眉, age=22)], 少林=[BlogMain1.User(username=圆真, gender=男, group=少林, age=35), BlogMain1.User(username=空智, gender=男, group=少林, age=47)]}

2. 分组统计

// key是门派名称,value是门派人数
Map<String, Long> collect1 = users.stream().collect(Collectors.groupingBy(User::getGroup, Collectors.counting()));
// {武当=4, 明教=5, 峨眉=3, 少林=2}

3. 分组求和

// key是门派名称,value是门派人年龄之和Map<String, Long> collect2 = users.stream().collect(Collectors.groupingBy(User::getGroup, Collectors.summingLong(User::getAge)));
// {武当=176, 明教=175, 峨眉=94, 少林=82}

4. 自定义分组条件------按姓名长度分组

// 按照姓名长度分组
Map<Integer, List<User>> collect3 = users.stream().collect(Collectors.groupingBy(x -> x.username.length()));
// {2=[BlogMain1.User(username=圆真, gender=男, group=少林, age=35), BlogMain1.User(username=空智, gender=男, group=少林, age=47)], 3=[BlogMain1.User(username=张无忌, gender=男, group=明教, age=23), BlogMain1.User(username=张三丰, gender=男, group=武当, age=56), BlogMain1.User(username=宋远桥, gender=男, group=武当, age=42), BlogMain1.User(username=张翠山, gender=男, group=武当, age=41), BlogMain1.User(username=殷梨亭, gender=男, group=武当, age=37), BlogMain1.User(username=周芷若, gender=女, group=峨眉, age=21), BlogMain1.User(username=宋青书, gender=男, group=峨眉, age=22)], 4=[BlogMain1.User(username=灭绝师太, gender=女, group=峨眉, age=51)], 8=[BlogMain1.User(username=金毛狮王--谢逊, gender=男, group=明教, age=47)], 9=[BlogMain1.User(username=紫衫龙王--黛绮丝, gender=女, group=明教, age=32), BlogMain1.User(username=白眉鹰王--殷天正, gender=男, group=明教, age=38), BlogMain1.User(username=青翼蝠王--韦一笑, gender=男, group=明教, age=35)]}

5. 自定义分组条件------按照多个字段分组

// 多个属性分组,按照门派和性别分组
Map<String, List<User>> collect4 = users.stream().collect(Collectors.groupingBy(x -> x.getGroup() + "_" + x.getGender()));
// {少林_男=[BlogMain1.User(username=圆真, gender=男, group=少林, age=35), BlogMain1.User(username=空智, gender=男, group=少林, age=47)], 明教_男=[BlogMain1.User(username=张无忌, gender=男, group=明教, age=23), BlogMain1.User(username=金毛狮王--谢逊, gender=男, group=明教, age=47), BlogMain1.User(username=白眉鹰王--殷天正, gender=男, group=明教, age=38), BlogMain1.User(username=青翼蝠王--韦一笑, gender=男, group=明教, age=35)], 峨眉_男=[BlogMain1.User(username=宋青书, gender=男, group=峨眉, age=22)], 武当_男=[BlogMain1.User(username=张三丰, gender=男, group=武当, age=56), BlogMain1.User(username=宋远桥, gender=男, group=武当, age=42), BlogMain1.User(username=张翠山, gender=男, group=武当, age=41), BlogMain1.User(username=殷梨亭, gender=男, group=武当, age=37)], 明教_女=[BlogMain1.User(username=紫衫龙王--黛绮丝, gender=女, group=明教, age=32)], 峨眉_女=[BlogMain1.User(username=灭绝师太, gender=女, group=峨眉, age=51), BlogMain1.User(username=周芷若, gender=女, group=峨眉, age=21)]}

高级用法

只是个人感觉比上面的高级一些,可能在大佬看来本质上都一样,只是更复杂了一点点。

1. 改变分组后的key和value

在上面的分组中,key还好,在4和5自定义条件分组中,改变了key。但是value呢?好像都是定死了,普通的分组就是该对象的集合,求和、统计就是一个数字,能不能我自己来规定返回的value类型呢?比如我要按照门派分组,得到每个门派里面每个人的名字,不需要其他的性别、年龄信息

// 按照门派分组,分组后 key 为Group对象, value变成String名字
Map<Group, List<String>> collect2 = users.stream().collect(Collectors.groupingBy(x -> new Group(x.getGroup(), x.getGroup() + "的描述"),Collectors.mapping(User::getUsername, Collectors.toCollection(ArrayList::new))));
// {BlogMain1.Group(name=明教, desc=明教的描述)=[张无忌, 金毛狮王--谢逊, 紫衫龙王--黛绮丝, 白眉鹰王--殷天正, 青翼蝠王--韦一笑], BlogMain1.Group(name=武当, desc=武当的描述)=[张三丰, 宋远桥, 张翠山, 殷梨亭], BlogMain1.Group(name=少林, desc=少林的描述)=[圆真, 空智], BlogMain1.Group(name=峨眉, desc=峨眉的描述)=[灭绝师太, 周芷若, 宋青书]}

2. 多级分组

先按照一个条件分组,在分组的基础上再按照另一个条件分组

// 多级分组,先按照门派分组,门派里面再按照名字长度分组
Map<Group, Map<Integer, List<User>>> collect3 = users.stream().collect(Collectors.groupingBy(x -> new Group(x.getGroup(), x.getGroup() + "的描述"),Collectors.groupingBy(x -> x.username.length())));
// {BlogMain1.Group(name=明教, desc=明教的描述)={3=[BlogMain1.User(username=张无忌, gender=男, group=明教, age=23)], 8=[BlogMain1.User(username=金毛狮王--谢逊, gender=男, group=明教, age=47)], 9=[BlogMain1.User(username=紫衫龙王--黛绮丝, gender=女, group=明教, age=32), BlogMain1.User(username=白眉鹰王--殷天正, gender=男, group=明教, age=38), BlogMain1.User(username=青翼蝠王--韦一笑, gender=男, group=明教, age=35)]}, BlogMain1.Group(name=武当, desc=武当的描述)={3=[BlogMain1.User(username=张三丰, gender=男, group=武当, age=56), BlogMain1.User(username=宋远桥, gender=男, group=武当, age=42), BlogMain1.User(username=张翠山, gender=男, group=武当, age=41), BlogMain1.User(username=殷梨亭, gender=男, group=武当, age=37)]}, BlogMain1.Group(name=少林, desc=少林的描述)={2=[BlogMain1.User(username=圆真, gender=男, group=少林, age=35), BlogMain1.User(username=空智, gender=男, group=少林, age=47)]}, BlogMain1.Group(name=峨眉, desc=峨眉的描述)={3=[BlogMain1.User(username=周芷若, gender=女, group=峨眉, age=21), BlogMain1.User(username=宋青书, gender=男, group=峨眉, age=22)], 4=[BlogMain1.User(username=灭绝师太, gender=女, group=峨眉, age=51)]}}

3. 我在项目中的使用例子

暂时就想到这么多,欢迎补充

java steam 使用指南-------groupingBy进阶用法相关推荐

  1. Frida Hook Android App 进阶用法之 Java 运行时

    FridaHookAndroid 本文旨在覆盖使用 Frida 对 Android App 进行 hook 的绝大多数场景.文章提到的所有代码以及被测 App,详见:https://github.co ...

  2. java Steam流的用法

    java Steam流的用法1 java Steam流的用法2 项目中的流用法不太懂,沾出来大家一路分享,有清楚地可以评论留言.

  3. goto在Java中的替代(break和continue的进阶用法)

    文章目录 前言 一.goto是什么? 二.goto与Java的关系 1.关系 2.Java中的标签 2.break和continue的进阶用法 总结 前言 goto语句是在源码级上的跳转,这使得其招致 ...

  4. Java工程师学习指南(2019最新版)

    写过一个Java工程师学习指南,我把它分为了四个部分,第一步是打好Java基础,掌握Java核心技术,第二步是掌握Java Web技术栈,能够做一些项目,第三步是掌握Java方面的进阶技术,包括网络编 ...

  5. java jsp学习指南_JSP教程–最终指南

    java jsp学习指南 编者注: JavaServer Pages(JSP)技术使您可以轻松创建同时包含静态和动态组件的Web内容. JSP技术提供了Java Servlet技术的所有动态功能,但提 ...

  6. 2022 最新华为面经分享:Java 高分面试指南

    大厂面试真题向来都是各大求职者的最佳练兵场,而今天小编带来的便是"HUAWEI"面经! 这是一次真实的面试经历,虽然不是我自己亲身经历但是听当事人叙述后便会深有同感(因为我朋友差点 ...

  7. 01 | Java入门级学习指南

    01 | Java入门级学习指南 前言 第一部分:JAVA 设计和编程基础 1.1Java 语言基础 1.2Java 面向对象 1.3Java 核心类库 1.4Java SE实战项目 第二部分:数据库 ...

  8. 超硬核Java工程师学习指南,真正的从入门到精通,众多粉丝亲测已拿offer!

    最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都是站在Java后端的全局上进行思 ...

  9. Mac 终端的入门指南与进阶技巧

    前言 hihi,勇敢的小伙伴儿们大家好啊,今天我想分享的是 Mac 终端的一些用法,说起分享的原因呢,也是在生活中受到了前辈的指导,那分享的目的呢,就是想在分享的同时和大家一起学习并逐渐掌握这个技能, ...

最新文章

  1. 【直播】杨剑砺:数据可视化漫谈
  2. Oracle\MS SQL Server的数据库多表关联更新UPDATE与多表更新
  3. 消息服务器怎么测试,如何对服务器性能进行测试
  4. Maven添加Oracle驱动及依赖
  5. KBMMW 4.81.00 发布
  6. 【静态站点(一)】之 静态网站生成器
  7. [MSP430DriverLib-2]使用延时让LED闪烁
  8. ai 实用新型专利_专利制度协调AI创造的创新
  9. 学校为什么要单位接收函_学校就快要截止收档案接收函了!你开始处理没?
  10. matlab数值拟合r2_MATLAB数据拟合实例(给出两组数据拟合y=ax±b).doc
  11. 吉林大学计算机数据中心排名,2018年度中国医院排行榜发布,吉大一院跻身50强!...
  12. 如何高效的自学编程(新手篇)
  13. 老司机教你下载tumblr上视频和图片的正确姿势
  14. 数据结构教程(第5版)李春葆 课后习题及答案(PDF版)
  15. 组合逻辑设计中的毛刺现象
  16. 四阶龙格库塔方程解二阶常微分方程组并计算船舶在迎浪下的纵摇埀荡耦合运动方程-附Python代码
  17. 【扩张卷积or空洞卷积】如何理解Dilated Convolutions(空洞卷积)
  18. 关于type_info与typeid
  19. 更换matlab版本需要注意事项,AMD 篇四:更换Matlab调用MKL库版本
  20. VMware Workstation pro无法在Windows上运行,检查可在Windows上运行的此应用的更新版本(无需卸载原先版本或原先版本卸载的按钮变成灰色)

热门文章

  1. 伊朗 2018 ICPC区域赛 A : Iranian ChamPions Cup
  2. 不学c语言能学mysql吗_学C语言难不难?以及简说数据库
  3. 软件测试类型——集成测试
  4. 98岁国学大师自曝只喜欢18岁的年轻美女
  5. 推荐 : 你想用深度学习谱写自己的音乐吗?这篇指南来帮助你!(附代码)...
  6. IDEA起步(一) - 工程结构
  7. RNA 提取步骤(trizol)
  8. 美团网手机客户端产品分析
  9. OpenMV新手上路1 -- OpenMV简介、参数描述
  10. css_属性选择器(根据属性名或属性值设定指定样式)