Java Stream中的mapToInt使用场景
业务场景:最近处理的数据比较多的是一些数据展示报表图,例如有柱状图,饼图,折线图等,那下面我列出其中一种数据展示处理过程涉及到的一个函数mapToInt,java8新特性的Stream,非常好用,很多高效简洁的数据处理函数。报表中不可或缺的一般都会有以横坐标为时间,纵坐标为数量的柱状图。那一般返回给到前端的数据格式类型就是一个Map集合。形如{}
业务场景:最近处理的数据比较多的是一些数据展示报表图,例如有柱状图,饼图,折线图等,那下面我列出其中一种数据展示处理过程涉及到的一个函数mapToInt,java8新特性的Stream,非常好用,很多高效简洁的数据处理函数。
报表中不可或缺的一般都会有以横坐标为时间,纵坐标为数量的柱状图。那一般返回给到前端的数据格式类型就是一个Map集合。形如
{
"2022-08":100,
"2022-07":80
}
一、设计思路
1.dao层xml&接口处理:
图表数据后台一般都是对应有一张原始表,时间-数量柱状图,则是将表中的时间字段分组,按月份分组,可以先将时间字段用MONTH(date)函数处理就能取出月份,或者用subString(date,1,7)进行年月截取,对数量字段进行sum求和等一系列的sql处理。xml中的sql返回类型一般可以是表对应的VO实体类,表对应一个VO类,老生常谈了。而接口对应的方法返回我们设计为List<实体VO>,查出来的数据会有多条,一个月一条数据,多个月则多条数据。
//常用的三种处理时间的函数,带上函数格式化时间后得到想要的内容再分组
select DATE_FORMAT("2022-09-30 11:46:21",'%Y%m'); //202209
select substring("2022-09-30 11:46:21",1,7); //2022-09
select MONTH("2022-09-30 11:46:21") // 9
2.service层处理:
这里比较灵活了,我主要是通过一个实际的业务需求来讲mapToInt方法的使用情况。我们调用dao层数据后,数据类型还是一个List<实体类VO>,我们需要取出每个月的一个数量,以及对应的月份,作为键值对。下面直接上代码
List<DataVO> list = idataDao.getData(DataVO); //调用dao层获取的数据
Map<String, Integer> data = new HashMap<String, Integer>();
for (int i = 1; i <= 12; ++i) { //++i在这里等同于i++ 效率更优
String month = String.valueOf(i);
Integer count = list.stream().filter(vo->month.equals(vo.getMonth())).mapToInt(DataVO::getCount).sum();
data.put(String.valueOf(i), count);
}
二、核心分析
首先我们的DataVO中,包含了除了对应表的字段属性之外,也添加了几个字段,如month,count,方便进行数据传递与处理,这里在dao层写sql就用到这两个字段来得到处理后的月份属性与数量求和属性。 也就是说list集合数据是长这个样子的:
[
{"month":"9",
"count": 100,
"业务字段1":null,
},
{"month":"8",
"count": 80,
"业务字段1":null,
},
]
接着new一个map,来接收转换后的数据,在用一个循环遍历1-12月份,然后就开始进入主题拉,运用stream的fileter过滤我们的list数据,将每个月的集合元素,也就是DataVO取到,后再用mapToInt方法,这个时候得到的是一个IntStream,其中包括将给定函数应用于此流的元素的结果,也就是通过DataVO::getCount过滤得到的数量值,这里类型最终还要转换成数值类型,所以再来一个sum方法,就一个数量所以求和也是一样的,我目的就是为了得到Integer类型,这样就得到一个月的一个数值,给put到map集合中就可以了。依次遍历。
最终转换得到的数据就是这个类型:
{
"9":100,
"8": 80
}
更多推荐
所有评论(0)