这几天工作不是很忙,抽空复习了一遍streamApi,又补充了一些小知识,再一次看书,感觉有些不一样的收获。

在项目开发过程中,会经常遇到需要分组的场景,就使用了java8 的groupby 语句,总结下,方便以后使用。

一,实体类

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class StudentEntity implements Serializable {private static final Logger logger = LoggerFactory.getLogger(StudentEntity.class);private static final long serialVersionUID = 8502398255966374441L;private int userId;private String userName;private Integer age;private List<StudentEntity> child = Lists.newArrayList();//薪资private int salary;Gson gson = new Gson();public static List<StudentEntity> createInitStudentList() {List<StudentEntity> list = new ArrayList<>();StudentEntity second = StudentEntity.builder().userId(1).userName("第一个小红").age(12).child(Lists.newArrayList()).build();StudentEntity third = StudentEntity.builder().userId(2).userName("第一个小花").age(12).child(Lists.newArrayList()).build();StudentEntity fourth = StudentEntity.builder().userId(3).userName("第一个小黄").age(13).child(Lists.newArrayList()).build();list.add(second);list.add(third);list.add(fourth);return list;}
}

二,常用查询

  /*** group by 常用查询*/@Testpublic void testGroupBy() {List<StudentEntity> studentList = StudentEntity.createInitStudentList();/*** 根据某个属性分组,获取实体对象的集合* 按照年龄分组 , 获取 StudentEntity 对象*/Map<Integer, List<StudentEntity>> studentEntityListMap = studentList.stream().filter(id -> id.getAge() > 4).collect(Collectors.groupingBy(StudentEntity::getAge));/*** 根据某个属性分数,并且统计数量* 按照年龄分组,并且统计获取用户数量*/Map<Integer, Long> userCountMap = studentList.stream().collect(Collectors.groupingBy(StudentEntity::getAge,Collectors.counting()));/*** 按照某个属性分组,并且获取某个属性的集合* 按照年龄分组,获取年龄*/Map<Integer, List<String>> userNameMap = studentList.stream().collect(Collectors.groupingBy(StudentEntity::getAge,Collectors.mapping(StudentEntity::getUserName, Collectors.toList())));/*** 按照年龄分组,join 用户名* groupy by 之后,可以对分组对象做各种map操作了*/Map<Integer, String> joinUserNameMap = studentList.stream().collect(Collectors.groupingBy(StudentEntity::getAge, Collectors.mapping(StudentEntity::getUserName, Collectors.joining(","))));/*** 按照某个属性分组,并且计算总和,最大(小),统计数量,平均数等* 按照年龄分组,统计每个人的薪资总和*/Map<Integer, Integer> collect = studentList.stream().collect(Collectors.groupingBy(StudentEntity::getAge,Collectors.summingInt(StudentEntity::getSalary)));/*** 按照年龄分组,统计每个人的薪资平均* Collectors.averagingIn 可以用来同时计算 average、min、max、count、sum*/Map<Integer, Double> averageMap = studentList.stream().collect(Collectors.groupingBy(StudentEntity::getAge,Collectors.averagingInt(StudentEntity::getSalary)));/*** 按照年龄分组,获取最薪资*/Map<Integer, Optional<StudentEntity>> collect1 = studentList.stream().collect(Collectors.groupingBy(StudentEntity::getAge,Collectors.maxBy(Comparator.comparing(StudentEntity::getSalary))));/*** group by 嵌套查询分组* 先按照年龄分组,然后按照薪资分组*/Map<Integer, Map<Integer, List<StudentEntity>>> salarMap = studentList.stream().collect(Collectors.groupingBy(StudentEntity::getAge, Collectors.groupingBy(StudentEntity::getSalary)));}

三,grouy by 源码了解下

四,不断深入,不断总结,让每次开发都有收获

【java8】StreamApi Group By 常用语句相关推荐

  1. mysql修改字段名称_MySQL增删改查的常用语句汇总

    以下是总结的mysql的常用语句,欢迎指正和补充~ 一.创建库,删除库,使用库 1.创建数据库:create database 库名; 2.删除数据库:drop database 库名; 3.使用数据 ...

  2. mysql 语句块语法_MySQL ------ MySQL常用语句的语法 (三十四)

    MySQL常用的语句语法 注意:1. | 符号用来指出几个选中中的一个,因此NULL | NOT NULL 表示给出null 或 not null 2.包含在方括号中的关键字或子句是可选的(如 [li ...

  3. sql server常用函数、常用语句

    一.常用函数 1.字符串函数 : charindex(':','abc:123')    --寻找一个字符在一段字符串中起始的位置 len('zhangsan')   --获取一段字符串的长度 lef ...

  4. 数据库最最常用语句(10年工作笔记)

     2015国庆在家没事,写点东西给大家.程序员不管做什么开发,迟早都要遇到数据库,今天把我多年的笔记发出来一起用哦,都是最最常用的语句. 一使用SELECT子句进行多表查询 SELECT 字段名 ...

  5. mysql 查询和修改组合_## 超详细MySQL常用语句,增删查改

    ## MySQL常用语句,增删查改,安装配置mysql服务 ***#新手博客,应届生,谢谢支持哟 记得点赞关注哟*** ***-----sql常见命令:--------*** 安装服务:mysqld ...

  6. Oracle数据库数据查询语句示例(包含大部分常用语句)

    Oracle数据库数据查询语句示例(包含大部分常用语句) 目标 本文用到的关系模式 语句示例 1.在创建的s,p,j和spj表中完成以下查询 (1)查询零件重量在10-20之间(包括10和20)的零件 ...

  7. MySQL数据库增删改查常用语句详解

    MySQL数据库增删改查常用语句详解 一 MySQL数据库表结构 1.1 常见数据类型 1.2 常用约束类型 1.3 MySQL存储引擎 二 DDL语句:数据定义语句 2.1 修改数据库密码 2.1. ...

  8. Mysql常用语句帅哥特供版

    [TOC] Mysql常用语句帅哥特供版 没错,这里的帅哥指的就是我自己 limit命令 查询 # limit命令 有两个参数, 第一个代表起始,从第几条开始. 第二个代表步长,取多少条. # 但是部 ...

  9. 以下是MySQL增删改查的常用语句汇总

    以下是总结的mysql的常用语句,欢迎指正和补充~ 一.创建库,删除库,使用库 1.创建数据库:create database 库名; 2.删除数据库:drop database 库名; 3.使用数据 ...

最新文章

  1. 分享Kali Linux 2017年第24周镜像文件
  2. WebAssembly 浏览器中运行c/c++模块
  3. 【错误记录】Flutter 界面报错 ( No MediaQuery widget ancestor found. | Scaffold widgets require a MediaQuery )
  4. 面向对象的一个实例 (银行管理系统)
  5. linux的模块化,GoboLinux 017 发布,模块化的 Linux 发行版
  6. C++morse code 摩尔斯电码算法(附完整源码)
  7. php大并发 大流量 大存储解决方案
  8. java long类型转string_JavaSE的学习——数据类型
  9. mysqld_safe启动mysql
  10. 交换两个数组 差最小 java_如何交换两个等长整形数组使其数组和的差最小(C和java实现)...
  11. 程序员工资那么高,却不知道怎么花?程序员花钱指南了解一下!
  12. C语言把输入值放入数组,//从键盘上输入若干整数,并将其存入数组中,并统计输入数据的个...
  13. php必填参数校验,laravel请求参数校验方法
  14. SQL Server新增字段并添加描述
  15. 数据库管理系统的未来是什么?
  16. c++编译时出现discards qualifiers [-fpermissive]的错误
  17. java 登陆界面 报告_java登陆界面实验报告
  18. ERROR: child process failed, exited with error number 1
  19. app后端 服务器端 后台 部署图
  20. 控件的颜色设置(本景色,文本色,文本背景色)

热门文章

  1. VLD 在VS2019中编译通过,但调试时报 应用程序无法正常启动(0xc0150002)
  2. 【51单片机】七段数码管和矩阵键盘的综合实验——计算器(思路+仿真电路+源代码)
  3. 基于遗传算法有时间窗、载重约束外卖配送路径优化
  4. Frida和IDA分析OLLVM控制流程平坦化
  5. 解决Flutter混合开发原生页面跳转Flutter页面黑屏的问题
  6. Java 中常用的进制转换
  7. Unity2D中让角色旋转朝向鼠标
  8. JavaScript-请把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字
  9. Windows7+CentOS7 启动项丢失问题解决
  10. Vj程序设计作业H8