【java8】StreamApi Group By 常用语句
这几天工作不是很忙,抽空复习了一遍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 常用语句相关推荐
- mysql修改字段名称_MySQL增删改查的常用语句汇总
以下是总结的mysql的常用语句,欢迎指正和补充~ 一.创建库,删除库,使用库 1.创建数据库:create database 库名; 2.删除数据库:drop database 库名; 3.使用数据 ...
- mysql 语句块语法_MySQL ------ MySQL常用语句的语法 (三十四)
MySQL常用的语句语法 注意:1. | 符号用来指出几个选中中的一个,因此NULL | NOT NULL 表示给出null 或 not null 2.包含在方括号中的关键字或子句是可选的(如 [li ...
- sql server常用函数、常用语句
一.常用函数 1.字符串函数 : charindex(':','abc:123') --寻找一个字符在一段字符串中起始的位置 len('zhangsan') --获取一段字符串的长度 lef ...
- 数据库最最常用语句(10年工作笔记)
2015国庆在家没事,写点东西给大家.程序员不管做什么开发,迟早都要遇到数据库,今天把我多年的笔记发出来一起用哦,都是最最常用的语句. 一使用SELECT子句进行多表查询 SELECT 字段名 ...
- mysql 查询和修改组合_## 超详细MySQL常用语句,增删查改
## MySQL常用语句,增删查改,安装配置mysql服务 ***#新手博客,应届生,谢谢支持哟 记得点赞关注哟*** ***-----sql常见命令:--------*** 安装服务:mysqld ...
- Oracle数据库数据查询语句示例(包含大部分常用语句)
Oracle数据库数据查询语句示例(包含大部分常用语句) 目标 本文用到的关系模式 语句示例 1.在创建的s,p,j和spj表中完成以下查询 (1)查询零件重量在10-20之间(包括10和20)的零件 ...
- MySQL数据库增删改查常用语句详解
MySQL数据库增删改查常用语句详解 一 MySQL数据库表结构 1.1 常见数据类型 1.2 常用约束类型 1.3 MySQL存储引擎 二 DDL语句:数据定义语句 2.1 修改数据库密码 2.1. ...
- Mysql常用语句帅哥特供版
[TOC] Mysql常用语句帅哥特供版 没错,这里的帅哥指的就是我自己 limit命令 查询 # limit命令 有两个参数, 第一个代表起始,从第几条开始. 第二个代表步长,取多少条. # 但是部 ...
- 以下是MySQL增删改查的常用语句汇总
以下是总结的mysql的常用语句,欢迎指正和补充~ 一.创建库,删除库,使用库 1.创建数据库:create database 库名; 2.删除数据库:drop database 库名; 3.使用数据 ...
最新文章
- 分享Kali Linux 2017年第24周镜像文件
- WebAssembly 浏览器中运行c/c++模块
- 【错误记录】Flutter 界面报错 ( No MediaQuery widget ancestor found. | Scaffold widgets require a MediaQuery )
- 面向对象的一个实例 (银行管理系统)
- linux的模块化,GoboLinux 017 发布,模块化的 Linux 发行版
- C++morse code 摩尔斯电码算法(附完整源码)
- php大并发 大流量 大存储解决方案
- java long类型转string_JavaSE的学习——数据类型
- mysqld_safe启动mysql
- 交换两个数组 差最小 java_如何交换两个等长整形数组使其数组和的差最小(C和java实现)...
- 程序员工资那么高,却不知道怎么花?程序员花钱指南了解一下!
- C语言把输入值放入数组,//从键盘上输入若干整数,并将其存入数组中,并统计输入数据的个...
- php必填参数校验,laravel请求参数校验方法
- SQL Server新增字段并添加描述
- 数据库管理系统的未来是什么?
- c++编译时出现discards qualifiers [-fpermissive]的错误
- java 登陆界面 报告_java登陆界面实验报告
- ERROR: child process failed, exited with error number 1
- app后端 服务器端 后台 部署图
- 控件的颜色设置(本景色,文本色,文本背景色)
热门文章
- VLD 在VS2019中编译通过,但调试时报 应用程序无法正常启动(0xc0150002)
- 【51单片机】七段数码管和矩阵键盘的综合实验——计算器(思路+仿真电路+源代码)
- 基于遗传算法有时间窗、载重约束外卖配送路径优化
- Frida和IDA分析OLLVM控制流程平坦化
- 解决Flutter混合开发原生页面跳转Flutter页面黑屏的问题
- Java 中常用的进制转换
- Unity2D中让角色旋转朝向鼠标
- JavaScript-请把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字
- Windows7+CentOS7 启动项丢失问题解决
- Vj程序设计作业H8