JDFrame 一款比 Java 8 Stream 更灵活的数据处理工具

一、JDFrame 介绍

在大数据处理领域,Apache Spark以其强大的分布式计算能力和丰富的数据处理API而广受好评。然而,在许多日常的软件开发场景中,我们面临的数据量可能并不需要Spark这样的分布式系统来处理。相反,我们更希望有一种工具能够在单机环境下提供类似Spark的便捷数据处理能力。Java 8Stream API虽然提供了一种简化的数据处理方式,但在复杂的数据转换和操作上,它仍显得有些力不从心。正是在这样的需求背景下,JDFrame应运而生。JDFrame借鉴了SparkAPI设计理念,为Java开发者提供了一套比Java Stream更为强大和灵活的流式数据处理工具。

JDFrame的核心优势之一是其丰富的API。它不仅包含了Java 8 Stream的基础操作,还增加了更多高级数据处理功能,如窗口函数、复杂条件过滤、自定义聚合,以及类似SQL的分组、聚合和连接操作。这些额外的功能使得JDFrame能够轻松应对复杂的数据操作需求,为开发者提供了更大的灵活性和便利性。

总之就是你可以使用SQL处理的思路去处理数据。

Githb 地址:https://github.com/burukeYou/JDFrame

使用示例:

添加依赖:

<dependency><groupId>io.github.burukeyou</groupId><artifactId>jdframe</artifactId><version>0.0.4</version>
</dependency>
public class JdframeTest {@Data@AllArgsConstructor@NoArgsConstructorpublic static class UserVO {private int id;private String name;private Integer age;private Integer score;}private static final List<UserVO> userVOS = Arrays.asList(new UserVO(1, "张三", 20, 90),new UserVO(2, "李四", 21, 92),new UserVO(3, "王五", 30, 95),new UserVO(4, "赵六", 15, 85),new UserVO(5, "小明", 32, 88),new UserVO(6, "小红", 18, 94),new UserVO(7, "小兰", 19, 75),new UserVO(8, "小青", 12, 60),new UserVO(9, "小王", 16, 34),new UserVO(10, "小李", 17, 49),new UserVO(11, "张三", 19, 59));public static void main(String[] args) {System.out.println("查看分数在 60 - 90 之间的姓名、分数的 Top5");SDFrame<FI2<String, BigDecimal>> sdf1 = SDFrame.read(userVOS).whereNotNull(UserVO::getScore) // 不为空.whereBetween(UserVO::getScore, 60, 90) // 范围过滤.groupBySum(UserVO::getName, UserVO::getScore) // 聚合求和.sortDesc(FI2::getC2) // 根据值降序排列.cutFirst(5); // 保留 Top5sdf1.show(); // 查看数据System.out.println("查看姓名中 张 开头的信息");SDFrame<UserVO> sdf2 = SDFrame.read(userVOS).whereNotNull(UserVO::getName) // 不为空.whereLikeLeft(UserVO::getName, "张"); // 模糊查询sdf2.show();System.out.println("查看80分以上的平均年龄");BigDecimal sdf3 = SDFrame.read(userVOS).whereNotNull(UserVO::getAge) // 不为空.whereNotNull(UserVO::getName) // 不为空.whereGt(UserVO::getScore,80) // 分数大于80.avg(UserVO::getAge); // 计算平均System.out.println(sdf3);}}

运行结果:

在这里插入图片描述

二、JDFrame VS Java Stream

JDFrame 在功能上要比 Java Stream 强大,在性能上相比呢,下面构建一千万条数据,进行分组计算后取 Top 数据,看谁处理的更快:

public class JdframePropertyTest {@Data@AllArgsConstructor@NoArgsConstructorpublic static class UserVO {private int id;private String name;private Integer age;private Integer score;}public static void main(String[] args) {List<UserVO> userVOS = new ArrayList<>();Random random = new Random();// 构造一千万条数据for (int i = 0; i < 10000000; i++) {userVOS.add(new UserVO(1, String.valueOf(i), (random.nextInt(91) + 10), (random.nextInt(71) + 30)));}System.out.println("准备测试数据完成,当前数据量:"+userVOS.size());// 根据每个年龄进行分组求和,最后取出分数最大的 top5 的年龄和总分数// java stream 处理System.out.println("开始 java stream 处理。。。");long t1 = System.currentTimeMillis();List<Map.Entry<Integer, Integer>> streamTop = userVOS.stream().filter(Objects::nonNull).filter(u -> Objects.nonNull(u.getAge())).filter(u -> Objects.nonNull(u.getScore())).collect(Collectors.groupingBy(UserVO::getAge, Collectors.summingInt(UserVO::getScore))).entrySet().stream().sorted(Map.Entry.<Integer, Integer>comparingByValue().reversed()).limit(5).collect(Collectors.toList());System.out.println("java stream 耗时:" + (System.currentTimeMillis() - t1) + " , 结果如下:");streamTop.forEach(map -> System.out.println("age: " + map.getKey() + " , score: " + map.getValue()));streamTop.clear();System.out.println("开始 jdFrame 处理。。。");t1 = System.currentTimeMillis();List<FI2<Integer, BigDecimal>> jdFrameTop = SDFrame.read(userVOS).whereNotNull(UserVO::getAge).whereNotNull(UserVO::getScore).groupBySum(UserVO::getAge, UserVO::getScore).sortDesc(FI2::getC2).cutFirst(5).toLists();System.out.println("jdFrame 耗时:" + (System.currentTimeMillis() - t1) + " , 结果如下:");jdFrameTop.forEach(fi2 -> System.out.println("age: " + fi2.getC1() + " , score: " + fi2.getC2()));}}

在这里插入图片描述

从结果上看,JDFrame 的速度逊色一些,但如果你处理数据量不大的情况,JDFrame 确实是一个非常好的工具。

比如数据量在一百万的时候,差距明显减少:

在这里插入图片描述

下面可以学习下 JDFrameApi

三、JDFrame Api

3.1 Where 条件过滤

3.1.1 精确过滤
SDFrame.read(userVOS)// is not nll.whereNotNull(UserVO::getName)// =.whereEq(UserVO::getName, "张三")// != , <>.whereNotEq(UserVO::getName, "李四");
3.1.2 模糊过滤
SDFrame.read(userVOS)// like "%小%".whereLike(UserVO::getName, "小")// like "小%".whereLikeLeft(UserVO::getName, "小")// like "%小".whereLikeRight(UserVO::getName, "小");
3.1.3 范围过滤
SDFrame.read(userVOS)// >.whereGt(UserVO::getScore, 60)// >=.whereGe(UserVO::getScore, 60)// <.whereLe(UserVO::getScore, 60)// <=.whereLt(UserVO::getScore, 60)// >= and <=.whereBetween(UserVO::getScore, 60, 80)// > and <=.whereBetweenR(UserVO::getScore, 60, 80)// >= and <.whereBetweenL(UserVO::getScore, 60, 80)// in.whereIn(UserVO::getScore, Arrays.asList(60, 70, 80))// not in.whereNotIn(UserVO::getScore, Arrays.asList(60, 70, 80));

3.2 数据统计

3.2.1 分组求和
JDFrame<UserVO> frame = JDFrame.read(userVOS);
// select name,sum(score) from userVOs group by name
frame.groupBySum(UserVO::getName, UserVO::getScore);// select name,age,sum(score) from userVOs group by name, age
frame.groupBySum(UserVO::getName, UserVO::getAge, UserVO::getScore);
3.2.2 分组求最大最小值
JDFrame<UserVO> frame = JDFrame.read(userVOS);// select name,max(age) from userVOs group by name
frame.groupByMaxValue(UserVO::getName, UserVO::getScore);// 和 groupByMaxValue 一致,拿到的是对象
frame.groupByMax(UserVO::getName, UserVO::getScore);// select name,min(score) from userVOs group by name
frame.groupByMinValue(UserVO::getName, UserVO::getScore);// 和 groupByMinValue 一致,拿到的是对象
frame.groupByMaxMin(UserVO::getName, UserVO::getScore);
3.2.3 分组计数
JDFrame<UserVO> frame = JDFrame.read(userVOS);// select count(1) from userVOs group by name
frame.groupByCount(UserVO::getName);// select count(1) from userVOs group by name, age
frame.groupByCount(UserVO::getName, UserVO::getAge);// select count(1) from userVOs group by name, age, score
frame.groupByCount(UserVO::getName, UserVO::getAge, UserVO::getScore);// select name,sum(score),count(1) from userVOs group by name
frame.groupBySumCount(UserVO::getName, UserVO::getScore);
3.2.4 整体统计
JDFrame<UserVO> frame = JDFrame.read(userVOS);
// select max(score) from userVOs
frame.maxValue(UserVO::getScore);
// 和 maxValue 一致,拿到的是对象
frame.max(UserVO::getScore);
// select min(score) from userVOs
frame.minValue(UserVO::getScore);
// 和 minValue 一致,拿到的是对象
frame.min(UserVO::getScore);
// select avg(score) from userVOs
frame.avg(UserVO::getScore);
// select sum(score) from userVOs
frame.sum(UserVO::getScore);
// select max(score),min(score) from userVOs
frame.maxMinValue(UserVO::getScore);
// 和 maxMinValue 一致,可以拿到对象
frame.maxMin(UserVO::getScore);

3.3 排序

JDFrame<UserVO> frame = JDFrame.read(userVOS);
// select * from userVOS order by score desc
frame.sortDesc(UserVO::getScore);
// select * from userVOS order by age asc
frame.sortAsc(UserVO::getAge);
// select * from userVOS order by score asc, age asc
frame.sortDesc(Sorter.sortDescBy(UserVO::getScore).sortAsc(UserVO::getAge));
// 自定义排序规则
frame.sortAsc(Comparator.comparing(e -> {if (e.getAge() > 20 && e.getScore() > 80) {return 1;} else {return 0;}
}));

3.4 去重

JDFrame<UserVO> frame = JDFrame.read(userVOS);
// 根据对象去重
frame.distinct();
// 根据某个字段去重
frame.distinct(UserVO::getName);
// 根据多个字段,先后去重
frame.distinct(UserVO::getName).distinct(UserVO::getAge);

3.5 join 连接

JDFrame<UserVO> frame1 = JDFrame.read(userVOS);
JDFrame<UserVO> frame2 = JDFrame.read(userVOS);
// 内连接
JDFrame<UserVO> join = frame1.join(frame2, (f1, f2) -> Objects.equals(f1.getId(), f2.getId()), (f1, f2) -> {// 具体合并曹组f1.setName(f2.getName());return f1;
});
// 左连接
JDFrame<UserVO> leftJoin = frame1.leftJoin(frame2, (f1, f2) -> Objects.equals(f1.getId(), f2.getId()), (f1, f2) -> {// 具体合并曹组f1.setName(f2.getName());return f1;
});
// 右连接
JDFrame<UserVO> rightJoin = frame1.rightJoin(frame2, (f1, f2) -> Objects.equals(f1.getId(), f2.getId()), (f1, f2) -> {// 具体合并曹组f1.setName(f2.getName());return f1;
});

3.6 其他操作

JDFrame<UserVO> frame = JDFrame.read(userVOS);
// 打印数据
frame.show();
// 获取表头
frame.columns();
// 获取某一列数据
frame.col(UserVO::getName);
// 获取第一条数据
frame.head();
// 获取前 5 数据
frame.head(5);
// 获取最后一个数据
frame.tail();
// 获取最后5条数据
frame.tail(5);
// 分页获取数据
frame.page(1, 5);// JDFrame 新增数据
frame.append(new UserVO(12, "小九", 19, 59));
// 多个 JDFrame 合并数据
frame.union(JDFrame.read(userVOS));// 数据截取
// 截取前5个数据
frame.cutFirst(5);
// 截取最后5个数据
frame.cutLast(5);
// 指定范围截取
frame.cut(2, 5);
// 分页截取
frame.cutPage(1, 5);// 数据拆分, 分为 5 个一组
frame.partition(5);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/389683.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openeuler的mariadb数据库安装

下载数据库 yum install mariadb-server 如果出现文件冲突如下删除即可 yum remove selinux-policy-targeted --nobest --nobest 无视需求关系 systemctl enable --now mariadb.service #自启动 mysql_secure_installation 初始化Mysql根据自己需求填y|n 第一次进…

vue echarts 横向柱状图,交错正负轴标签

横向柱状图&#xff1a; 同一个页面展示多个相同横向柱状图&#xff1b; 代码如下&#xff1a; <template><div style"display: flex;justify-content: space-around;"><div v-for"(chart,index) in barChartList" :key"index"…

finalshell连接kali-Linux失败问题略谈

如果你正在使用fianlshell或者xshell等终端软件远程连接Linux进行工作&#xff0c;但是突然有一天&#xff0c;你死活连不上了&#xff0c;报错提示如下&#xff1a; java.net.ConnectException: Connection refused: connect 就像这样&#xff1a; 哪怕是重装虚拟机&#xff0…

易境通散货集拼系统是如何让散拼效率提高80%的?

散货集拼为什么必须要有靠谱的系统才行&#xff1f;因为散拼很容易出现各种问题&#xff0c;而且会连带着影响不同的环节。货物整箱利用空间不充足&#xff0c;会导致集装箱数量增加&#xff0c;运费成本激增&#xff0c;返工整理会耽误发货&#xff0c;延长送货时间&#xff0…

U盘文件或目录损坏无法读取?详解两大恢复策略

在日常的数字生活中&#xff0c;U盘作为便携的数据存储工具&#xff0c;承载着我们的重要文件与回忆。然而&#xff0c;当U盘中的文件或目录突然变得无法读取时&#xff0c;这份便捷瞬间转化为困扰。U盘文件或目录的损坏&#xff0c;往往是由于多种因素共同作用的结果&#xff…

使用 SpringBoot + 虚拟线程将服务性能提升几百倍

虚拟线程简介 虚拟线程是 Java 平台的一项创新特性。虚拟线程是一种轻量级的线程实现,它在操作系统层面并不对应真实的内核线程,而是由 JVM 进行管理和调度。这使得可以在不消耗大量系统资源的情况下创建大量的线程,从而能够更高效地处理并发任务。 虚拟线程与普通线程的区…

IT运维中,如何快速进行故障排查?(以银行APP交易故障为例)

一、事件背景 正值"五一"黄金周旅游高峰期&#xff0c;某城商行的手机APP突然出现大面积交易失败和严重卡顿现象。据初步统计&#xff0c;从上午10点开始APP的交易成功率从正常的99%骤降至75%左右&#xff0c;用户反馈的交易失败投诉量在短短2小时内激增了500%。与此…

【PyTorch】多对象分割项目

【PyTorch】单对象分割项目 对象分割任务的目标是找到图像中目标对象的边界。实际应用例如自动驾驶汽车和医学成像分析。这里将使用PyTorch开发一个深度学习模型来完成多对象分割任务。多对象分割的主要目标是自动勾勒出图像中多个目标对象的边界。 对象的边界通常由与图像大小…

2025浙江(杭州)国际安防产品展览会(浙江安博会)

2025浙江&#xff08;杭州&#xff09;国际智慧城市与安防产品展览会 2025hangzhou smart city And Security Expo 时间:2025年4月23-25日 地点:杭州国际博览中心 展会介绍 浙江&#xff08;杭州&#xff09;国际智慧城市及安防产品博览会&#xff08;简称:浙江安博会&#…

告别繁琐,AI助你轻松制作PPT!2024四大工具推荐

PPT是现代商务和教育领域中不可或缺的工具。然而&#xff0c;制作一份高质量的PPT往往需要花费大量的时间和精力。AI PPT制作工具的出现可以很好地解决这一问题。下面为大家推荐几个AI PPT制作工具。 笔灵AIPPT&#xff1a;智能设计&#xff0c;一键生成 链接&#xff1a;htt…

基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页--添加商品功能

技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 前文三篇登录和注册功能的实现 基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网&#xff08;1&#xff09;-项目搭建&#xff08;前期准备工作…

Golang | Leetcode Golang题解之第309题买卖股票的最佳时机含冷冻期

题目&#xff1a; 题解&#xff1a; func maxProfit(prices []int) int {if len(prices) 0 {return 0}n : len(prices)f0, f1, f2 : -prices[0], 0, 0for i : 1; i < n; i {newf0 : max(f0, f2 - prices[i])newf1 : f0 prices[i]newf2 : max(f1, f2)f0, f1, f2 newf0, n…

【秋招笔试】24-07-27-OPPO-秋招笔试题(后端卷)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 💡 01.二进制反转游戏 问题描述 K小姐…

体验教程:通义灵码陪你备战求职季

本场景将带大家体验在技术面试准备场景下&#xff0c;如何通过使用阿里云通义灵码实现高效的编程算法题练习 、代码优化、技术知识查询等工作&#xff0c;帮助开发者提升实战能力&#xff0c;更加从容地应对面试挑战。主要包括&#xff1a; 1、模拟题练习&#xff1a;精心挑选…

卸载Windows软件的正确姿势,你做对了吗?

前言 今天有小伙伴突然问我&#xff1a;她把软件都卸载了&#xff0c;但是怎么软件都还在运行&#xff1f; 这个问题估计很多小伙伴都是遇到过的&#xff0c;对于电脑小白来说&#xff0c;卸载Windows软件真的真的真的是一件很难的事情。所以&#xff0c;今天咱们就来讲讲&am…

2024最简七步完成 将本地项目提交到github仓库方法

2024最简七步完成 将本地项目提交到github仓库方法 文章目录 2024最简七步完成 将本地项目提交到github仓库方法一、前言二、具体步骤1、github仓库创建2、将远程仓库拉取并合并&#xff08;1&#xff09;初始化本地仓库&#xff08;2&#xff09;本地仓库与Github仓库关联&…

数据可视化工具,免费无限制制作报表

许多企业在报表制作上投入了大量资金&#xff0c;使用各种收费软件&#xff0c;往往只能满足基本需求&#xff0c;且操作复杂&#xff0c;让人感到无比头疼。不过最近我发现之前一直在做数据大屏的山海鲸可视化&#xff0c;现在新增了报表功能&#xff0c;不仅各种功能都可以免…

远程访问mysql数据库的正确打开方式

为了安全&#xff0c;mysql数据库默认只能本机登录&#xff0c;但是在有些时候&#xff0c;我们会有远程登录mysql数据库的需求&#xff0c;这时候应该怎么办呢&#xff1f; 远程访问mysql数据&#xff0c;需要两个条件&#xff1a; 首先需要mysql服务器将服务绑定到0.0.0.0…

【JVM】类加载器和双亲委派模型

什么是类加载器 如果想要了解什么是类加载器就需要清楚一个Java文件是如何运行的。我们可以看下图&#xff1a; 首先要知道操作系统是不能直接运行Java文件的&#xff0c;所以就需要通过JVM将Java文件转换为操作系统可以运行的文件类型&#xff0c;步骤如下&#xff1a; 类加…

入门必读:11个最受欢迎的UI设计网页软件详细评测

即时设计首发UI设计网页软件的轻量化和在线协作已成为当前UI设计网页软件的发展方向。网页UI设计不容易&#xff0c;实用的网页UI制图软件更难找到。随着网络的快速发展&#xff0c;网站迅速崛起&#xff0c;网页UI设计也很流行。UI设计网页软件即时设计是一种协同设计工具&…