当前位置: 首页 > news >正文

设计模式、Java8新特性实战 - List<T> 抽象统计组件

一、背景

在日常写代码的过程中,针对List集和,统计里面的某个属性,是经常的事情,针对List的某个属性的统计,我们目前大部分时候的代码都是这样写,每统计一个变量,就要定义一个值,且要在for循环增加一行累计的代码,比较繁琐,而且代码写出来不够优雅。

	    Double chineseSum = 0d;//班级积分Double classScore = 0d;//定义变量
//        .....for(Student student : students){//统计语文成绩chineseSum += student.getChinese();//统计班级成绩classScore += student.getClassScore();//统计.....}

二、解决思路

利用顶层抽象的思维,既然要做统计,可以抽象出几个点

  • 统计的属性是什么?
  • 如何统计?
  • 统计之后的结果放到哪里?

基于这三个维度的最终核心思想:给定任意的集和,你告诉我要统计哪些属性,如何统计,我把结果统计好放到你设定的对象里面。这样有点像Spring的控制反转,调用方只要告诉我规则就好了,统计的执行过程由统计组件进行帮你统计。调用方只需要调用过后拿结果就行了。

三、实现方案

基于上面所说的思想,再结合Java 1.8的函数式编程以及泛型和设计模式,实现了List集和的属性统计组件

核心实现类图

四、关键代码展示

通过构建统计上下文进行统计,通过函数式编程的方法指定统计属性、统计规则、统计结果放到哪里

/*** 统计年龄、统计分数* @author chenfoxin* @date: 2022/9/1 17:40* @return AbstractConsolidationMode* @param statResult*/public static StatContext<StatResult> buildStatStudentContext(StatResult statResult){return new StatContext<>(statResult,//统计年龄new StatAttribute<>(Student::getAge, new IntegerStatRule(), StatResult::setAge),//统计分数new StatAttribute<>(Student::getClassScore, new DoubleStatRule(NumberConstants.INT_TWO), StatResult::setScore),//统计数学+语文成绩(组合字段)new StatAttribute<>((Function<Student, Double>) student -> DoubleUtils.add(NumberConstants.INT_TWO,student.getChinese(),student.getMath()), new DoubleStatRule(NumberConstants.INT_TWO),StatResult::setMathChinese));}
        List<Student> students = new ArrayList<>();Student stu1 = new Student(11,98D,95D,87D);Student stu2 = new Student(12,97D,56D,78D);//构建liststudents.add(stu1);students.add(stu2);//创建全局对象StatResult statResult = new StatResult();//构建统计上下文StatContext<StatResult> context = StatManager.buildStatStudentContext(statResult);//进行统计StatManager.execute(students,context);//输出结果log.info("统计结果:" + statResult);

感兴趣的朋友可以到我的博客上把源码拉取下来看看

基于JAVA 1.8函数式编程 泛型 设计模式抽象的通用 List统计组件: 设计模式、Java8新特性实战 - List<T> 抽象统计组件

http://www.lryc.cn/news/108405.html

相关文章:

  • 【JavaEE初阶】博客系统后端
  • day51-Mybatis-Plus/代码生成器
  • 22.Netty源码之解码器
  • R语言【Tidyverse、Tidymodel】的机器学习方法
  • vscode 第一个文件夹在上一层文件夹同行,怎么处理
  • [JavaScript游戏开发] 绘制冰宫宝藏地图、人物鼠标点击移动、障碍检测
  • 【NLP概念源和流】 01-稀疏文档表示(第 1/20 部分)
  • 服务器运行python程序的使用说明
  • 8.2一日总结
  • JavaScript(四)DOM及CSS操作
  • window中,关闭java占用端口的进程
  • 【Python】PySpark 数据计算 ⑤ ( RDD#sortBy方法 - 排序 RDD 中的元素 )
  • Elasticsearch官方测试数据导入
  • uniapp项目的pdf文件下载与打开查看
  • DeepVO 论文阅读
  • HOT71-字符串解码
  • redis-server进程无法关闭终极解决方案
  • (5)将固件加载到没有ArduPilot固件的主板上
  • wpf画刷学习1
  • Opencv C++实现yolov5部署onnx模型完成目标检测
  • django bootstrap html实现左右布局,带折叠按钮,左侧可折叠隐藏
  • Mapping温度分布验证选择数据记录仪时需要考虑的13件事
  • 【题解】 判断一个链表是否为回文结构
  • Microsoft Message Queuing Denial-of-Service Vulnerability
  • 软件设计师(五)软件工程基础知识
  • Java中的JUnit单元测试方法的使用
  • 一文学透设计模式——抽象工厂模式
  • Vue3与Vue2区别和总结(1)
  • 【华秋推荐】物联网入门学习模块 ESP8266
  • 本科专科毕业论文如何选题-附1000多论文题目-论文选题--【毕业论文】