放弃Java8的Stream流,我使用JDFrame!

科技   2024-07-31 12:08   四川  
我为什么放弃Java8的Stream流,转而使用JDFrame。

先来说说Java8的Stream流。自从Java8推出Stream API后,我们的代码确实变得简洁了不少。

然而,Stream流的各种API记起来还是挺费劲的。每次写代码都要翻文档,生怕自己哪里写错了。而且,有时候为了实现一个简单的统计操作,需要写一大堆链式调用,搞得头都大了。

每次看到那些又长又臭的链式调用,心里总觉得不太舒服。

DataFrame模型的启发


在处理大数据时,我习惯了使用Spark和Pandas这样的工具。它们的DataFrame模型让数据操作变得异常简便和直观。

所以,我就在想,能不能在Java中也实现类似的语义化API呢?

# JDFrame


经过一番摸索,我发现了JDFrame,一个JVM层级的仿DataFrame工具。它不仅简化了Java8的Stream流处理,还提供了更为语义化的API,让我这种有“代码洁癖”的人终于找到了救星。

JDFrame的用法不仅简洁明了,还大大提高了代码的可读性和可维护性。

快速上手JDFrame


为了让大家更好地理解JDFrame的强大之处,我用一个简单的案例来展示它的用法。假设我们有一组学生数据,统计每个学校学生年龄在9到16岁之间的合计分数,并获取分数前2名的学校。以下是用JDFrame实现的代码:
static List<Student> studentList = new ArrayList<>();
static { studentList.add(new Student(1, "a", "一中", "一年级", 11, new BigDecimal(1))); studentList.add(new Student(2, "a", "一中", "一年级", 11, new BigDecimal(1))); studentList.add(new Student(3, "b", "一中", "三年级", 12, new BigDecimal(2))); studentList.add(new Student(4, "c", "二中", "一年级", 13, new BigDecimal(3))); studentList.add(new Student(5, "d", "二中", "一年级", 14, new BigDecimal(4))); studentList.add(new Student(6, "e", "三中", "二年级", 14, new BigDecimal(5))); studentList.add(new Student(7, "e", "三中", "二年级", 15, new BigDecimal(5)));}
SDFrame<FI2<String, BigDecimal>> sdf2 = SDFrame.read(studentList) .whereNotNull(Student::getAge) .whereBetween(Student::getAge, 9, 16) .groupBySum(Student::getSchool, Student::getScore) .sortDesc(FI2::getC2) .cutFirst(2);
sdf2.show();

这个案例相当于以下SQL查询:
SELECT school, SUM(score)FROM studentsWHERE age IS NOT NULL AND age BETWEEN 9 AND 16GROUP BY schoolORDER BY SUM(score) DESCLIMIT 2

看到了吗?JDFrame让我们的代码变得如此简洁和易读,再也不用为那些繁琐的Stream API而烦恼了。

 JDFrame强大功能


JDFrame不仅仅是让代码变得简洁,它还提供了许多强大的功能。比如,JDFrame可以方便地进行数据的筛选、汇总、去重、分组和聚合等操作。

数据筛选


JDFrame提供了丰富的筛选功能,让你可以轻松过滤数据。例如,你可以这样过滤年龄在3到6岁之间的学生:
SDFrame.read(studentList)
.whereBetween(Student::getAge, 3, 6) .show();


数据汇总


你还可以对数据进行各种汇总操作,例如求最大值、最小值、平均值等:
JDFrame<Student> frame = JDFrame.read(studentList);Student oldestStudent = frame.max(Student::getAge);Integer maxAge = frame.maxValue(Student::getAge);BigDecimal avgAge = frame.avg(Student::getAge);

数据去重


JDFrame支持根据特定字段去重,这在原生Stream中是很难实现的:
List<Student> uniqueStudents = SDFrame.read(studentList).distinct(Student::getSchool).toLists();

数据分组和聚合

JDFrame的分组和聚合操作也非常简便,让你可以轻松实现类似SQL的group by操作:
JDFrame<Student> frame = JDFrame.from(studentList);List<FI2<String, BigDecimal>> groupedData = frame.groupBySum(Student::getSchool, Student::getAge).toLists();

更多功能

JDFrame还支持生成序号列、补充缺失条目等高级操作。例如,你可以这样生成序号列:
SDFrame.read(studentList) .sortDesc(Student::getAge) .addRowNumberCol(Student::setRank) .show(30);

如果需要补充缺失的学校条目,可以这样做:
List<String> allDim = Arrays.asList("一中", "二中", "三中", "四中");SDFrame.read(studentList).replenish(Student::getSchool, allDim, (school) -> new Student(school)).show();
# 总结

放弃Java8的Stream流处理,我选择了JDFrame。它不仅让代码更简洁、更易读,而且大大提升了开发效率。和我一样有“代码洁癖”的同学,JDFrame绝对是个好选择!
对编程、职场感兴趣的同学,可以链接我,微信:yagebug  拉你进入“程序员交流群”。

🔥鸭哥私藏精品 热门推荐🔥

鸭哥作为一名老码农,整理了全网最全《Java高级架构师资料合集》
资料包含了《IDEA视频教程》《最全Java面试题库》、最全项目实战源码及视频》及《毕业设计系统源码》总量高达 650GB 。全部免费领取!全面满足各个阶段程序员的学习需求。
Java面试那些事儿
回复 java ,领取Java面试题。分享AI编程,Java教程,Java面试辅导,Java编程视频,Java下载,Java技术栈,AI工具,Java开源项目,Java简历模板,Java招聘,Java实战,Java面试经验,IDEA教程。
 最新文章