enum和Collection.stream()你这样用过么
最近在做一个数据图表展示的功能,显示订单近七天或者近半月的数量和金额。可以理解成下图所示的样子:

我是用枚举和集合的stream方法实现的数据初始化和组装,枚举用来动态初始化时间范围,集合的stream方法来将初始化的数据转换成map,以日期为key,然后查询数据库的数据组装到map中,组转完后返回数据即可。我觉得这个方法不错,特此记录一下。
流程如下:

模拟代码如下:
/*** 订单汇总测试*/
public class TransinfoSum {public static void main(String[] args) {// 模拟传参,前端传递显示近七天还是近半月,和枚举呼应int code = 1;// 初始化,根据code初始化日期范围List<Transinfo> transinfoList = new ArrayList<Transinfo>();for (int t=0; t<TimeTypeEnum.getTimeTypeEnum(code).getNum(); t++) {// 从当前日期往前减ttransinfoList.add(new Transinfo(DateUtils.dateTime(DateUtils.addDays(new Date(), -t))));}// list转mapMap<String, Transinfo> transinfoMap = transinfoList.stream().collect(Collectors.toMap(Transinfo::getDate, transinfo -> transinfo));// 模拟数据库数据List<Transinfo> transinfoListFromDB = new ArrayList<Transinfo>();// 开始组装数据for (Transinfo transinfo : transinfoListFromDB) {String date = transinfo.getDate();transinfoMap.get(date).setNum(transinfo.getNum());transinfoMap.get(date).setAmount(transinfo.getAmount());}// 返回数据即可}
}
初始化后的数据是这样的:
Transinfo{date='2023-11-03', num=0, amount=0}
Transinfo{date='2023-11-02', num=0, amount=0}
Transinfo{date='2023-11-01', num=0, amount=0}
Transinfo{date='2023-10-31', num=0, amount=0}
Transinfo{date='2023-10-30', num=0, amount=0}
Transinfo{date='2023-10-29', num=0, amount=0}
Transinfo{date='2023-10-28', num=0, amount=0}
全部代码如下:
/*** 枚举类,定义时间类型*/
public enum TimeTypeEnum {WEEK(1, "近七天", 7),FIFTEEN(2, "近半月", 15),MONTH(3, "近一月", 30);private int code;private String msg;private int num;TimeTypeEnum(int code, String msg, int num) {this.code = code;this.msg = msg;this.num = num;}public int getCode() {return code;}public String getMsg() {return msg;}public int getNum() {return num;}public static TimeTypeEnum getTimeTypeEnum(int code) {for (TimeTypeEnum timeTypeEnum : TimeTypeEnum.values()) {if (code == timeTypeEnum.getCode()) {return timeTypeEnum;}}return null;}
}
/*** 订单汇总*/
public class Transinfo {public Transinfo(){}public Transinfo(String date){this.date = date;this.num = 0;this.amount = BigDecimal.ZERO;}private String date;private Integer num;private BigDecimal amount;public String getDate() {return date;}public void setDate(String date) {this.date = date;}public Integer getNum() {return num;}public void setNum(Integer num) {this.num = num;}public BigDecimal getAmount() {return amount;}public void setAmount(BigDecimal amount) {this.amount = amount;}@Overridepublic String toString() {return "Transinfo{" +"date='" + date + '\'' +", num=" + num +", amount=" + amount +'}';}
}
/*** 订单汇总测试*/
public class TransinfoSum {public static void main(String[] args) {// 模拟传参int code = 1;// 初始化List<Transinfo> transinfoList = new ArrayList<Transinfo>();for (int t=0; t<TimeTypeEnum.getTimeTypeEnum(code).getNum(); t++) {transinfoList.add(new Transinfo(DateUtils.dateTime(DateUtils.addDays(new Date(), -t))));}// list转mapMap<String, Transinfo> transinfoMap = transinfoList.stream().collect(Collectors.toMap(Transinfo::getDate, transinfo -> transinfo));// 模拟数据库数据List<Transinfo> transinfoListFromDB = new ArrayList<Transinfo>();// 开始组装数据for (Transinfo transinfo : transinfoListFromDB) {String date = transinfo.getDate();transinfoMap.get(date).setNum(transinfo.getNum());transinfoMap.get(date).setAmount(transinfo.getAmount());}// 返回数据即可}
}
package com.exam.common.utils;import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
import org.apache.commons.lang3.time.DateFormatUtils;/*** 时间工具类* * @author ruoyi*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils
{public static String YYYY = "yyyy";public static String YYYY_MM = "yyyy-MM";public static String YYYY_MM_DD = "yyyy-MM-dd";public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM","yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};/*** 获取当前Date型日期* * @return Date() 当前日期*/public static Date getNowDate(){return new Date();}/*** 获取当前日期, 默认格式为yyyy-MM-dd* * @return String*/public static String getDate(){return dateTimeNow(YYYY_MM_DD);}public static final String getTime(){return dateTimeNow(YYYY_MM_DD_HH_MM_SS);}public static final String dateTimeNow(){return dateTimeNow(YYYYMMDDHHMMSS);}public static final String dateTimeNow(final String format){return parseDateToStr(format, new Date());}public static final String dateTime(final Date date){return parseDateToStr(YYYY_MM_DD, date);}public static final String parseDateToStr(final String format, final Date date){return new SimpleDateFormat(format).format(date);}public static final Date dateTime(final String format, final String ts){try{return new SimpleDateFormat(format).parse(ts);}catch (ParseException e){throw new RuntimeException(e);}}/*** 日期路径 即年/月/日 如2018/08/08*/public static final String datePath(){Date now = new Date();return DateFormatUtils.format(now, "yyyy/MM/dd");}/*** 日期路径 即年/月/日 如20180808*/public static final String dateTime(){Date now = new Date();return DateFormatUtils.format(now, "yyyyMMdd");}/*** 日期型字符串转化为日期 格式*/public static Date parseDate(Object str){if (str == null){return null;}try{return parseDate(str.toString(), parsePatterns);}catch (ParseException e){return null;}}/*** 获取服务器启动时间*/public static Date getServerStartDate(){long time = ManagementFactory.getRuntimeMXBean().getStartTime();return new Date(time);}/*** 计算相差天数*/public static int differentDaysByMillisecond(Date date1, Date date2){return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));}/*** 计算时间差** @param endDate 最后时间* @param startTime 开始时间* @return 时间差(天/小时/分钟)*/public static String timeDistance(Date endDate, Date startTime){long nd = 1000 * 24 * 60 * 60;long nh = 1000 * 60 * 60;long nm = 1000 * 60;// long ns = 1000;// 获得两个时间的毫秒时间差异long diff = endDate.getTime() - startTime.getTime();// 计算差多少天long day = diff / nd;// 计算差多少小时long hour = diff % nd / nh;// 计算差多少分钟long min = diff % nd % nh / nm;// 计算差多少秒//输出结果// long sec = diff % nd % nh % nm / ns;return day + "天" + hour + "小时" + min + "分钟";}/*** 增加 LocalDateTime ==> Date*/public static Date toDate(LocalDateTime temporalAccessor){ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());return Date.from(zdt.toInstant());}/*** 增加 LocalDate ==> Date*/public static Date toDate(LocalDate temporalAccessor){LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());return Date.from(zdt.toInstant());}
}相关文章:
enum和Collection.stream()你这样用过么
最近在做一个数据图表展示的功能,显示订单近七天或者近半月的数量和金额。可以理解成下图所示的样子: 我是用枚举和集合的stream方法实现的数据初始化和组装,枚举用来动态初始化时间范围,集合的stream方法来将初始化的数据转换成…...
unittest与pytest的区别
Unittest vs Pytest 主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面比较unittest和pytest的区别: 用例编写规则 用例前置与后置条件 断言 测试报告 失败重跑机制 参数化 用例分类执行 如果不好看,可以看下面表格&…...
YOLOv7优化策略:IOU系列篇 | 引入MPDIoU,WIoU,SIoU,EIoU,α-IoU等创新
💡💡💡本文独家改进:MPDIoU,WIoU,SIoU,EIoU,α-IoU等二次创新,总有一种适合你的数据集 MPDIoU,WIoU,SIoU,EIoU,α-IoU | 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 …...
SQL Server2000mdf升级SQL Server2005数据库还原
SQL Server2000数据库还原sqlserver 2000mdf升级 sqlserver 2008数据库还原SQL Server2005数据库脚本 sqlserver数据库低版本升级成高版本 sqlserver数据库版本升级 数据库版本还原 如果本机安装了sqlserver2012或者sqlserver2019等高版本 怎么样才能运行sqlserver2000的数据库…...
webSocket推送太快导致前端渲染卡顿问题优化
优化思路: 把webSocket接收到的数据用一个数组存起来,达到一定长度再统一渲染,可根据推送数据的速度适当调解数组长度限制,如果一段时间内改数组长度打不要渲染条件,就用定时器之间渲染 data() {return {tempDataWsLi…...
(Java)泛型总结
泛型类 public class Student<E> {private E a;public Student(E a){this.aa;}public void show(){System.out.println(a);} } 泛型方法 public <E> void show(E a){System.out.println(a);} 泛型接口 public interface Inter <T>{void show(T a); } 类…...
C++ Package继承层次,采用继承实现快递包裹的分类计价(分为空运2日达、陆运3日达)。
一、问题描述: Package继承层次,采用继承实现快递包裹的分类计价(分为空运2日达、陆运3日达)。自定义一个或多个快递公司,自定义计价方法,设计合适、合理的界面文本提示,以广东省内某市为起点&…...
中文大语言模型汇总
推荐一篇非常棒的github:Awesome-Chinese-LLM 另附语言模型排行榜:FastChat 里面总结了几乎所有目前主流的中文大语言模型。在此记录一下,方便以后慢慢学习。...
GEE:GEE中实现简单计算器
作者:CSDN _养乐多_ 本文记录了在 Google Earth Engine(GEE)上实现简单计算器的代码。 APP链接:https://949384116.users.earthengine.app/view/simplecalculator 文章目录 一、完整代码二、代码链接 一、完整代码 // 定义初始…...
概念解析 | 神经网络中的位置编码(Positional Encoding)
注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Positional Encoding 神经网络中的位置编码(Positional Encoding) A Gentle Introduction to Positional Encoding in Transformer Models, Part 1 1.背景介绍 在自然语言处理任…...
【ubuntu】搭建lamp架构
一、准备工作 1、更新源 apt-get updateapt #就是一个管理包的工具,理解为centos中的yum update #表示让apt执行更新的操作,更新的内容为软件列表。#为什么要更新软件列表? 就时本地会隔断时间进行同步镜像站的资源包,但是我…...
GNU ld(链接器)的主要功能
作用: 链接器linker是Bintutils的一种重要工具,负责将编译后的目标文件(.o)合并成一个可执行文件或者共享库。 一、链接器的文件结构可以概括为以下几个关键部分: 输入文件 (Input Files): 输入文件通常是目标文件(.o 文件&#…...
springboot整合FTP实现文件传输
实现ftp文件传输的步骤: 1.ftp绑定ip端口登录 2.切换到指定地址 3.文件下载 4.关闭ftp连接 项目中使用的jar包 <!-- ftp包--><dependency><groupId>commons-net</groupId><artifactId>commons-net</artifactId><vers…...
Spring Boot 2.x.x 升级至 Spring Boot 3.x.x
小伙伴们,你们好呀,好久不见,我是老寇,跟我一起升级Spring Boot版本 一、JDK 版本 JDK8 需要升级至 JDK17 二、Spring Boot 版本 Spring Boot 2.x.x 升级至 Spring Boot 3.x.x 三、Java Api 变更 javax 变更成 jakarta 四、…...
光电直读水表支持短时间多次抄表吗
传统的水表读数方式已经逐渐无法满足人们对于便捷、准确的需求。为此,光电直读水表应运而生,它凭借出色的读数性能和稳定的准确性,赢得了广大用户的一致好评。那么,光电直读水表支持短时间多次抄表吗?答案是肯定的&…...
家庭私人影院 - Windows搭建Emby媒体库服务器并远程访问 「无公网IP」
文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中,观看视频绝对是主力应用场景之一&…...
核心舱在轨飞行VR沉浸式互动体验满足大家宇宙探险的心愿
近日神州十七号载人飞船迎来发射,随着我国载人航天工程进入空间站应用与发展阶段,在轨航天探索和运维工作进入常态化阶段,然而每次出征都牵动着亿万人民的心,对航天航空的好奇和向往也越来越强烈。为了让普通人也能体验乘坐飞船上…...
k8s集群中namespace状态一直显示Terminating
一、问题现象 今天在做测试时,在一个namespace下无法启动pod,查看ns状态一直显示Terminating [rootnode1 ~]# kubectl get ns NAME STATUS AGE configmap Terminating 135d default Active …...
数据库高速缓存配置
数据库一般都配置数据高速缓存,并且可以高速缓存中按页大小分不同的缓冲池。 Oracle: db_cache_size是指db_block_size对应的缓冲池,也可以指定非db_block_size的缓冲池,一般也都会再配置一个32K的缓冲池,两个缓冲池加…...
性能优化之懒加载 - 基于观察者模式和单例模式的实现
一、引入 在前端性能优化中,关于图片/视频等内容的懒加载一直都是优化利器。当用户看到对应的视图模块时,才去请求加载对应的图像。 原理也很简单,通过浏览器提供的 IntersectionObserver - Web API 接口参考 | MDN (mozilla.org),…...
新手必看!5款热门单片机选型指南(51、STM32、PIC、AVR、MSP430)
新手工程师必读:5大单片机选型实战指南(51/STM32/PIC/AVR/MSP430) 第一次打开单片机选型手册时,密密麻麻的参数表就像天书——时钟频率、Flash容量、ADC精度这些术语在眼前跳动,而老板给的采购预算表上的数字又让人手…...
LangChain实战:从零构建一个联网搜索增强的RAG问答系统
1. 为什么需要联网搜索增强的RAG系统 传统的RAG(检索增强生成)系统有个致命伤——它只能回答知识库里已有的内容。想象一下,你去年精心构建了一个旅游推荐系统,但今年新开的网红景点它完全不知道,因为数据没更新。这就…...
Bedook超声波传感器应用测试
⒈实物和型号⑴产品型号:Bedook UM30-T20P-C31S12-X(PNP型)⑵实物图片:⑶产品规格:一般说明感应距离150…2000mm调节范围200…2000mm盲区0…150mm标准检测物100mm100mm换能器频率112kHz响应延时出厂设定200ms工作方式/…...
前后端框架模式对比(golang)
前后端架构模式对比:分离与不分离 现代Web开发中,前后端架构的选择直接影响开发效率、维护成本和系统性能。结合Golang的实现,可以更清晰地分析前后端分离(如REST API 前端框架)与不分离(如服务端渲染&…...
JS逆向新手也能搞定:手把手教你用Node.js补全ali140滑块canvas环境(附完整代码)
JS逆向新手也能搞定:手把手教你用Node.js补全ali140滑块canvas环境(附完整代码) 第一次接触JS逆向时,看到那些复杂的加密逻辑和环境检测代码,确实让人望而生畏。特别是遇到canvas这种需要模拟浏览器环境的场景…...
RPCS3游戏汉化实战指南:从零构建多语言游戏体验
RPCS3游戏汉化实战指南:从零构建多语言游戏体验 【免费下载链接】rpcs3 PS3 emulator/debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 还在为PS3经典游戏的日文界面而困扰吗?通过RPCS3模拟器的强大补丁系统,您可以…...
避开这3个坑!GD32 ADC用DMA搬运数据时,定时器触发配置的常见误区与调试技巧
避开这3个坑!GD32 ADC用DMA搬运数据时,定时器触发配置的常见误区与调试技巧 在嵌入式开发中,ADC(模数转换器)的数据采集是一个基础但至关重要的功能。当我们需要高效、稳定地采集大量数据时,通常会使用DMA…...
GsonFormat深度解析:如何高效处理复杂JSON数据结构
GsonFormat深度解析:如何高效处理复杂JSON数据结构 【免费下载链接】GsonFormat 根据Gson库使用的要求,将JSONObject格式的String 解析成实体 项目地址: https://gitcode.com/gh_mirrors/gs/GsonFormat GsonFormat是一款专为Android Studio和IntelliJ IDEA设…...
开源视频编辑解决方案:从零构建专业级Web视频编辑器OpenCut
开源视频编辑解决方案:从零构建专业级Web视频编辑器OpenCut 【免费下载链接】OpenCut The open-source CapCut alternative 项目地址: https://gitcode.com/gh_mirrors/ap/OpenCut 在数字内容创作爆炸的时代,视频编辑工具的选择直接影响创作效率与…...
3大创新方法构建AI训练数据集:老照片修复实战指南
3大创新方法构建AI训练数据集:老照片修复实战指南 【免费下载链接】Bringing-Old-Photos-Back-to-Life Bringing Old Photo Back to Life (CVPR 2020 oral) 项目地址: https://gitcode.com/gh_mirrors/br/Bringing-Old-Photos-Back-to-Life 老照片修复AI项目…...
