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

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()你这样用过么

最近在做一个数据图表展示的功能&#xff0c;显示订单近七天或者近半月的数量和金额。可以理解成下图所示的样子&#xff1a; 我是用枚举和集合的stream方法实现的数据初始化和组装&#xff0c;枚举用来动态初始化时间范围&#xff0c;集合的stream方法来将初始化的数据转换成…...

unittest与pytest的区别

Unittest vs Pytest 主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面比较unittest和pytest的区别: 用例编写规则 用例前置与后置条件 断言 测试报告 失败重跑机制 参数化 用例分类执行 如果不好看&#xff0c;可以看下面表格&…...

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推送太快导致前端渲染卡顿问题优化

优化思路&#xff1a; 把webSocket接收到的数据用一个数组存起来&#xff0c;达到一定长度再统一渲染&#xff0c;可根据推送数据的速度适当调解数组长度限制&#xff0c;如果一段时间内改数组长度打不要渲染条件&#xff0c;就用定时器之间渲染 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日达)。

一、问题描述&#xff1a; Package继承层次&#xff0c;采用继承实现快递包裹的分类计价&#xff08;分为空运2日达、陆运3日达&#xff09;。自定义一个或多个快递公司&#xff0c;自定义计价方法&#xff0c;设计合适、合理的界面文本提示&#xff0c;以广东省内某市为起点&…...

中文大语言模型汇总

推荐一篇非常棒的github&#xff1a;Awesome-Chinese-LLM 另附语言模型排行榜&#xff1a;FastChat 里面总结了几乎所有目前主流的中文大语言模型。在此记录一下&#xff0c;方便以后慢慢学习。...

GEE:GEE中实现简单计算器

作者&#xff1a;CSDN _养乐多_ 本文记录了在 Google Earth Engine&#xff08;GEE&#xff09;上实现简单计算器的代码。 APP链接&#xff1a;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 #就是一个管理包的工具&#xff0c;理解为centos中的yum update #表示让apt执行更新的操作&#xff0c;更新的内容为软件列表。#为什么要更新软件列表&#xff1f; 就时本地会隔断时间进行同步镜像站的资源包&#xff0c;但是我…...

GNU ld(链接器)的主要功能

作用&#xff1a; 链接器linker是Bintutils的一种重要工具&#xff0c;负责将编译后的目标文件(.o)合并成一个可执行文件或者共享库。 一、链接器的文件结构可以概括为以下几个关键部分&#xff1a; 输入文件 (Input Files): 输入文件通常是目标文件&#xff08;.o 文件&#…...

springboot整合FTP实现文件传输

实现ftp文件传输的步骤&#xff1a; 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

小伙伴们&#xff0c;你们好呀&#xff0c;好久不见&#xff0c;我是老寇&#xff0c;跟我一起升级Spring Boot版本 一、JDK 版本 JDK8 需要升级至 JDK17 二、Spring Boot 版本 Spring Boot 2.x.x 升级至 Spring Boot 3.x.x 三、Java Api 变更 javax 变更成 jakarta 四、…...

光电直读水表支持短时间多次抄表吗

传统的水表读数方式已经逐渐无法满足人们对于便捷、准确的需求。为此&#xff0c;光电直读水表应运而生&#xff0c;它凭借出色的读数性能和稳定的准确性&#xff0c;赢得了广大用户的一致好评。那么&#xff0c;光电直读水表支持短时间多次抄表吗&#xff1f;答案是肯定的&…...

家庭私人影院 - 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.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…...

核心舱在轨飞行VR沉浸式互动体验满足大家宇宙探险的心愿

近日神州十七号载人飞船迎来发射&#xff0c;随着我国载人航天工程进入空间站应用与发展阶段&#xff0c;在轨航天探索和运维工作进入常态化阶段&#xff0c;然而每次出征都牵动着亿万人民的心&#xff0c;对航天航空的好奇和向往也越来越强烈。为了让普通人也能体验乘坐飞船上…...

k8s集群中namespace状态一直显示Terminating

一、问题现象 今天在做测试时&#xff0c;在一个namespace下无法启动pod&#xff0c;查看ns状态一直显示Terminating [rootnode1 ~]# kubectl get ns NAME STATUS AGE configmap Terminating 135d default Active …...

数据库高速缓存配置

数据库一般都配置数据高速缓存&#xff0c;并且可以高速缓存中按页大小分不同的缓冲池。 Oracle&#xff1a; db_cache_size是指db_block_size对应的缓冲池&#xff0c;也可以指定非db_block_size的缓冲池&#xff0c;一般也都会再配置一个32K的缓冲池&#xff0c;两个缓冲池加…...

性能优化之懒加载 - 基于观察者模式和单例模式的实现

一、引入 在前端性能优化中&#xff0c;关于图片/视频等内容的懒加载一直都是优化利器。当用户看到对应的视图模块时&#xff0c;才去请求加载对应的图像。 原理也很简单&#xff0c;通过浏览器提供的 IntersectionObserver - Web API 接口参考 | MDN (mozilla.org)&#xff0c…...

新手必看!5款热门单片机选型指南(51、STM32、PIC、AVR、MSP430)

新手工程师必读&#xff1a;5大单片机选型实战指南&#xff08;51/STM32/PIC/AVR/MSP430&#xff09; 第一次打开单片机选型手册时&#xff0c;密密麻麻的参数表就像天书——时钟频率、Flash容量、ADC精度这些术语在眼前跳动&#xff0c;而老板给的采购预算表上的数字又让人手…...

LangChain实战:从零构建一个联网搜索增强的RAG问答系统

1. 为什么需要联网搜索增强的RAG系统 传统的RAG&#xff08;检索增强生成&#xff09;系统有个致命伤——它只能回答知识库里已有的内容。想象一下&#xff0c;你去年精心构建了一个旅游推荐系统&#xff0c;但今年新开的网红景点它完全不知道&#xff0c;因为数据没更新。这就…...

Bedook超声波传感器应用测试

⒈实物和型号⑴产品型号&#xff1a;Bedook UM30-T20P-C31S12-X&#xff08;PNP型&#xff09;⑵实物图片&#xff1a;⑶产品规格&#xff1a;一般说明感应距离150…2000mm调节范围200…2000mm盲区0…150mm标准检测物100mm100mm换能器频率112kHz响应延时出厂设定200ms工作方式/…...

前后端框架模式对比(golang)

前后端架构模式对比&#xff1a;分离与不分离 现代Web开发中&#xff0c;前后端架构的选择直接影响开发效率、维护成本和系统性能。结合Golang的实现&#xff0c;可以更清晰地分析前后端分离&#xff08;如REST API 前端框架&#xff09;与不分离&#xff08;如服务端渲染&…...

JS逆向新手也能搞定:手把手教你用Node.js补全ali140滑块canvas环境(附完整代码)

JS逆向新手也能搞定&#xff1a;手把手教你用Node.js补全ali140滑块canvas环境&#xff08;附完整代码&#xff09; 第一次接触JS逆向时&#xff0c;看到那些复杂的加密逻辑和环境检测代码&#xff0c;确实让人望而生畏。特别是遇到canvas这种需要模拟浏览器环境的场景&#xf…...

RPCS3游戏汉化实战指南:从零构建多语言游戏体验

RPCS3游戏汉化实战指南&#xff1a;从零构建多语言游戏体验 【免费下载链接】rpcs3 PS3 emulator/debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 还在为PS3经典游戏的日文界面而困扰吗&#xff1f;通过RPCS3模拟器的强大补丁系统&#xff0c;您可以…...

避开这3个坑!GD32 ADC用DMA搬运数据时,定时器触发配置的常见误区与调试技巧

避开这3个坑&#xff01;GD32 ADC用DMA搬运数据时&#xff0c;定时器触发配置的常见误区与调试技巧 在嵌入式开发中&#xff0c;ADC&#xff08;模数转换器&#xff09;的数据采集是一个基础但至关重要的功能。当我们需要高效、稳定地采集大量数据时&#xff0c;通常会使用DMA…...

GsonFormat深度解析:如何高效处理复杂JSON数据结构

GsonFormat深度解析&#xff1a;如何高效处理复杂JSON数据结构 【免费下载链接】GsonFormat 根据Gson库使用的要求,将JSONObject格式的String 解析成实体 项目地址: https://gitcode.com/gh_mirrors/gs/GsonFormat GsonFormat是一款专为Android Studio和IntelliJ IDEA设…...

开源视频编辑解决方案:从零构建专业级Web视频编辑器OpenCut

开源视频编辑解决方案&#xff1a;从零构建专业级Web视频编辑器OpenCut 【免费下载链接】OpenCut The open-source CapCut alternative 项目地址: https://gitcode.com/gh_mirrors/ap/OpenCut 在数字内容创作爆炸的时代&#xff0c;视频编辑工具的选择直接影响创作效率与…...

3大创新方法构建AI训练数据集:老照片修复实战指南

3大创新方法构建AI训练数据集&#xff1a;老照片修复实战指南 【免费下载链接】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项目…...