业务场景:最近处理的数据比较多的是一些数据展示报表图,例如有柱状图,饼图,折线图等,那下面我列出其中一种数据展示处理过程涉及到的一个函数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

        }

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐