• 多个列表参数一一对应使用枚举


    1、业务背景

    写这个东西的初衷是因为在我们的系统中有一个报表导出功能,在报表导出时,会定义三个列表的数据,如下图所示:

    在这里插入图片描述

    和明显,上面这种定义参数的形式,现在看起来还好,如果有十几个,二十几个参数,而且这种情况在报表中是非常常见的,十几个列一般都是会有的,那写起来就会非常乱,所以我定义了以下的规则来约束这种比较乱的参数定义方式。代码如下:

    2、代码

    2.1、pom文件

    <dependency>
        <groupId>com.google.guavagroupId>
        <artifactId>guavaartifactId>
        <version>31.0.1-jreversion>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2.2、工具类

    public interface ReportTitle {
        /**
         * 报表的数据列名称
         * @return 返回报表的数据列名称
         */
        String getColumn();
    
        /**
         * 报表的列中文名称
         * @return 返回报表的列中文名称
         */
        String getName();
    
        /**
         * 报表的每列占excel尺寸
         * @return 返回报表的每列占屏尺寸
         */
        Integer getSize();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    /**
     * 报表枚举工具类
     *
     * @author 杜佳乐
     * @date 2022/11/03  20:39:52
     */
    @Slf4j
    public class ReportUtil {
    
        /**
         * 导出头部分类
         * 将枚举类转换成两个数组,为了使得报表的中文列名、英文列名、列尺寸相互对应
         * @param enumModel 枚举实体类class
         * @return 返回转换之后的两列名称
         */
        public static ReportTitleDTO exportTitleSort(Object enumModel) {
            // 定义返回的头列表模型 
            ReportTitleDTO reportTitleDTO = new ReportTitleDTO();
            // 定义解析出来的枚举类数据临时变量 
            ReportTitle[] reportTitles = null;
            try {
                Method valuesMethod = ((Class) enumModel).getDeclaredMethod("values");
                // 通过反射取出对应的属性列表 
                reportTitles = (ReportTitle[]) valuesMethod.invoke(enumModel);
            } catch (Exception e) {
                log.error("枚举映射出现异常,异常信息为:{}", e);
            }
            // 如果为空,则返回 
            if (null == reportTitles) {
                return reportTitleDTO;
            }
    
            int exportTitleLength = reportTitles.length;
            // 定义 titleColumnList 报表的数据列名称列表 
            List<String> titleColumnList = new ArrayList<>(exportTitleLength);
            // 定义 titleNameList 报表的列中文名称列表 
            List<String> titleNameList = new ArrayList<>(exportTitleLength);
            // 定义 titleSizeList 报表的每列占excel尺寸列表 
            List<Integer> titleSizeList = new ArrayList<>(exportTitleLength);
            for (ReportTitle recordEnum : reportTitles) {
                titleColumnList.add(recordEnum.getColumn());
                titleNameList.add(recordEnum.getName());
                titleSizeList.add(recordEnum.getSize());
            }
            // 组装返回模型并返回 
            reportTitleDTO.setTitleColumnList(titleColumnList.toArray(new String[0]));
            reportTitleDTO.setTitleNameList(titleNameList.toArray(new String[0]));
            reportTitleDTO.setTitleSizeList(Ints.toArray(titleSizeList));
            return reportTitleDTO;
        }
    
    }
    
    
    • 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
    @Data
    public class ReportTitleDTO {
        /**
         * 报表的数据列名称
         */
        private String[] titleColumnList;
    
        /**
         * 报表的列中文名称
         */
        private String[] titleNameList;
    
        /**
         * 报表的每列占excel尺寸
         */
        private int[] titleSizeList;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.3、测试类

    @AllArgsConstructor
    public enum ReportEnum implements ReportTitle {
        /**
         * ID
         */
        ID("id","唯一键",5),
    
        /**
         * 姓名
         */
        NAME("name","姓名",10),
    
        /**
         * 电话
         */
        TEL_NO("telNo","电话",15),
    
        ;
        /**
         * 报表的数据列名称
         */
        String column;
    
        /**
         * 报表的列中文名称
         */
        String name;
    
        /**
         * 报表的每列占excel尺寸
         */
        Integer size;
    
        @Override
        public String getColumn() {
            return column;
        }
    
        @Override
        public String getName() {
            return name;
        }
    
        @Override
        public Integer getSize() {
            return size;
        }
    }
    
    • 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
    public class ReportTest {
        public static void main(String[] args) {
            ReportTitleDTO reportTitleDTO = ReportUtil.exportTitleSort(ReportEnum.class);
    
            System.out.println(reportTitleDTO);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    Apollo 应用与源码分析:Monitor监控 - Monitor_manage&recurrent_runner分析
    DBA数据库运维-MySQL安装篇(glibc,源码)
    【面试题】 对象、原型、原型链与继承?这次我懂了!
    10-26 maven配置
    SpringBoot SpringBoot 基础篇 4 基于 SpringBoot 的SSMP 整合案例 4.15 删除功能
    图的基本概念
    初阶数据结构学习记录——둘 顺序表
    ActiveMq学习⑦__ActiveMq协议
    -----指针进阶
    基于树莓派的安保巡逻机器人--(一、快速人脸录入与精准人脸识别)
  • 原文地址:https://blog.csdn.net/qq_41931364/article/details/127737929