对于报表数据大部分情况下使用写sql的方式为大屏/报表提供数据来源,但是对于某些复杂情况下仅仅使用sql无法实现,或者实现起来困难的时候,会采取通过代码实现复杂的逻辑最终将结果返回。
对于相对复杂的报表,经常需要做数据的连接即表与表的join,分组,计算等操作。sql天然支持这些操作,实现起来很轻松。但是当我们在java代码中需要对数据进行连接时,原生支持的就并不那么友好,我们常常会这么实现
现在有两个集合
1 2 |
|
对应数据结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
需求
contractDetails 根据 contractNo关联 contractInfos,过滤出status = '已签订’的数据
再根据 contractDetails 中的contractNo分组,分别求每个 contractNo对应的moneyTotal之和
最终输出的应该为一个map
1 |
|
通常我们会这么实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
显然这个实现时比较复杂的,因为使用sql的话无非就是 join 连接之后加上group by分组。求和。就可以轻易解决这个问题。那么看看后面这个工具类,再思考有没有更简单的办法实现。
集合数据流CollectionDataStream的功能是通过接口对集合之间做关联,实现了类似sql join和left join两个操作
并且实现和java中的Stream相互转换的功能。
聚合数据结构将集合转换成类似表结构的数据结构,包含表名,数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
|
AggregationData代表一行数据,aggregationMap的key为表名,value为对应的数据
来详细看看这个接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
|
注意joinUseHashOnEqualCondition和join两个方法的区别。
如果集合之间的连接时某个字段等值连接,那么使用joinUseHashOnEqualCondition,其内部使用的是map分组之后进行连接。而直接使用join的话连接条件可自定义,但是是通过双重循环进行条件判断,效率较低。因此等值情况下,使用joinUseHashOnEqualCondition效率更高。
还是已上面的需求为例
先进行两个集合之间的连接
1 2 3 4 5 6 |
|
代码解析
1 |
|
是将集合contractDetails转换为表名为t1的数据流,
1 2 3 4 5 6 7 |
|
内连接contractInfos,同时给contractInfos起别名t2,连接条件是等值连接 t1的contractNo和contractInfos的contractNol连接之后得到新的聚合数据流
当然也可以使用自定义的连接实现
1 2 3 4 5 |
|
这里通过内连接,那么也起到了一个过滤的作用。连接完成之后我们还要分组进行计算,那么就需要用到下一个工具类
是对stram中原生Collectors的一个扩展,实现了更多做报表常用分组的一些操作,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
|
1 2 3 4 5 6 7 8 |
|
这样的实现显然更加简单,也减少了出错的的概率,减少了代码量,提升了效率。
实现了集合之间的连接操作,并且是流式操作,可以一口气不断连接多个集合。
实现了与Stream之间的相互转换。利用stream的功能可以实现各种复杂操作,例如过滤,转换,分组等。
效率上有一定的保证,对于等值连接采用了Map优化,并且在内连接时,考虑使用后小表连大表进行优化,在一些情况下减少循环次数,在bean转换为行聚合数据时使用cglib下的BeanMap减少内存的占用和性能的消耗
以上是怎么使用Java工具类实现高效编写报表的详细内容。更多信息请关注PHP中文网其他相关文章!