首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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

我为什么放弃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还支持生成序号列、补充缺失条目等高级操作。例如,你可以这样生成序号列:

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绝对是个好选择!

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O11ZSKql802Tan-ePN7SSLUA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券