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

news2024/9/23 7:28:43

一、背景

在日常写代码的过程中,针对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);
        //构建list
        students.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.coloradmin.cn/o/834298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++、python双语言弹窗教程与对比

Messagebox弹窗 MessageBox指的是显示一个模态对话框&#xff0c;其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息&#xff0c;如状态或错误的信息。消息框中返回一个整数值&#xff0c;该值指示用户单击了哪个按钮。 例子&#xff1a; 本文介绍了用C、Pytho…

STM32基础入门学习笔记:核心板 电路原理与驱动编程

文章目录&#xff1a; 一&#xff1a;LED灯操作 1.LED灯的点亮和熄灭 延迟闪烁 main.c led.c led.h BitAction枚举 2.LED呼吸灯&#xff08;灯的强弱交替变化&#xff09; main.c delay.c 3.按键控制LED灯 key.h key.c main.c 二&#xff1a;FLASH读写程序(有…

数据安全能力框架模型-详细解读(二)

数据安全能力框架构成 1&#xff09; 数据安全治理 管理视角&#xff1a;从组织制度流程上提出要求&#xff0c;由于数据在各业务系统之间流转&#xff0c;需要设立高级管理层参与决策的数据安全管理部门&#xff0c;统筹和规划多部门之间的工作&#xff1b;需要设立跨组织的…

34.利用matlab解 多变量多目标规划问题(matlab程序)

1.简述 学习目标&#xff1a;适合解 多变量多目标规划问题&#xff0c;例如 收益最大&#xff0c;风险最小 主要目标法&#xff0c;线性加权法&#xff0c;权值我们可以自己设定。 收益函数是 70*x(1)66*x(2) &#xff1b; 风险函数是 0.02*x(1)^20.01*x(2)^20.04*(x…

RabbitMQ 备份交换机和死信交换机

为处理生产者生产者将消息推送到交换机中&#xff0c;交换机按照消息中的路由键即自身策略无法将消息投递到指定队列中造成消息丢失的问题&#xff0c;可以使用备份交换机。 为处理在消息队列中到达TTL的过期消息&#xff0c;可采用死信交换机进行消息转存。 通过上述描述可知&…

c高级day2shell指令

一编程语言 编程语言面向过程c面向对象c编译型语言c\c解释性语言shell脚本\python 需要解析器 二shell脚本 2.1操作系统的结构 应用层:app\代码 应用层通过shell解析器完成和内核层的交互 --------------------------------------- 内核层:内核的五大功能:1、设…

Django的FBV和CBV

Django的FBV和CBV 基于django开发项目时&#xff0c;对于视图可以使用 FBV 和 CBV 两种模式编写。 FBV&#xff0c;function base views&#xff0c;其实就是编写函数来处理业务请求。 from django.contrib import admin from django.urls import path from app01 import view…

SIT3232E——高静电防护 3.3V 单电源供电双通道 RS232 收发器,可替代MAX3232

SIT3232E 是一款 3.0V~5.5V 供电、双通道、低功耗、高静电防护 ESD 保护&#xff0c;完全满足 TIA/EIA-232 标准要求的 RS-232 收发器。 SIT3232E 包括两个驱动器和两个接收器&#xff0c;具有增强形 ESD 保护功能&#xff0c;达到 15kV 以上 HBM ESD 、 8kV …

64 # 实现一个 http-server

准备工作 上一节实现了通过 commander 的配置获取到用户的参数&#xff0c;下面完成借用 promise 写成类的方法一节没有完成的任务&#xff0c;实现一个 http-server&#xff0c;https://www.npmjs.com/package/http-server&#xff0c;http-server 是一个简单的零配置命令行静…

centos7 yum安装mysql5.7

卸载mysql 以下指令查看是否安装过 rpm -qa | grep -i mysql 如果发现已经安装&#xff0c;需要卸载了再安装&#xff08;据说&#xff0c;这样的卸载是不彻底的。&#xff09; rpm -e mysql 卸载 mariadb yum -y remove mariadb-libs-1:5.5.68-1.el7.x86_64 下载和安装mys…

Liunx:进程

冯诺依曼体系结构: 目前我们使用的计算机,包括笔记本,台式电脑,或者后端服务器,都是一堆硬件的集合,他们不是无序的组合在一起,首先它们要有协同能力,要求它们有协同能力,这就意味着它们之间一定要组织好,构成一个系统,他们才能对外输出,提供计算服务. 当代计算机都是由冯诺依曼…

漏洞扫描工具-goby(九)

什么是Goby&#xff1f; Goby是一款基于网络空间测绘技术的新一代网络安全工具&#xff0c;它通过给目标网络建立完整的资产知识库&#xff0c;进行网络安全事件应急与漏洞应急。 Goby可提供最全面的资产识别&#xff0c;目前预置了超过10万种规则识别引擎&#xff0c;能够针对…

Unity CanvasGroup组件

文章目录 1. 简介2. 组件属性2.1 Alpha(透明度)2.2 Interactable(是否为可交互)2.3 Blocks Raycasts(是否接受射线监测)2.4 Ignore Parent Groups(忽视上层的画布组带来的影响) 1. 简介 CanvasGroup(画布组) 组件&#xff0c;可集中控制整组 UI 元素(自身和所有子物体)的某些属…

Microsoft Message Queuing Denial-of-Service Vulnerability

近期官方公布了一个MSMQ的拒绝服务漏洞&#xff0c;可能因为网络安全设备的更新&#xff0c;影响业务&#xff0c;值得大家关注。 漏洞具体描述参见如下&#xff1a; Name: Microsoft Message Queuing Denial-of-Service Vulnerability Description: Microsoft Message Queuing…

jar命令的安装与使用

场景&#xff1a; 项目中经常遇到使用WinR软件替换jar包中的文件&#xff0c;有时候存在WinRAR解压替换时提示没有权限&#xff0c;此时winRAR不能用还有有什么方法替换jar包中的文件。 方法&#xff1a; 使用jar命令进行修改替换 问题&#xff1a; 执行jar命令报错jar 不…

Macbook恢复出厂设置2023详细步骤

Macbook随着用户的使用时间增长&#xff0c;文件的不断添加和各种应用程序的安装之后可能会开始变得迟缓卡顿&#xff0c;这时候选择将设备还原为默认出厂设置可以有效的解决Macbook的使用卡顿以及缓慢的问题。那么Macbook怎么恢复出厂设置?Macbook如何恢复出厂设置?一起来了…

【雕爷学编程】MicroPython动手做(37)——驱动LCD与图文显示4

MixPY——让爱(AI)触手可及 MixPY布局 主控芯片&#xff1a;K210&#xff08;64位双核带硬件FPU和卷积加速器的 RISC-V CPU&#xff09; 显示屏&#xff1a;LCD_2.8寸 320*240分辨率&#xff0c;支持电阻触摸 摄像头&#xff1a;OV2640&#xff0c;200W像素 扬声器&#…

卸载本机已安装的node.js(v.16.13.0版本)

因为要用多版本的node&#xff0c;准备安装一个nvm管理&#xff0c;所以需要先卸载掉原来安装的v.16.13.0版本。 记录一下卸载过程 1、在系统设置-应用里卸载node 妈蛋这样卸载报错。。找了下根本没有这个路径 那就只能最简单的方法了&#xff0c;全部删掉 1、删除node的安装…

Tensorflow2-初识

TensorFlow2是一个深度学习框架&#xff0c;可以理解为一个工具&#xff0c;有谷歌的全力支持&#xff0c;具有易用、灵活、可扩展、性能优越、良好的社区资源等优点。 1、环境的搭建 1.1 Anaconda3的安装 https://www.anaconda.com/ Python全家桶&#xff0c;包括Python环境和…

python爬虫(六)_urllib2:handle处理器和自定义opener

本文将介绍handler处理器和自定义opener&#xff0c;更多内容请参考:python学习指南 opener和handleer 我们之前一直使用的是urllib2.urlopen(url)这种形式来打开网页&#xff0c;它是一个特殊的opener(也就是模块帮我们建好的)&#xff0c;opener是urllib2.OpenerDirectory的…