Stream&Kotlin 还能再进化成什么

简介: Java 早期缺乏简洁的数据集运算语法,导致开发效率低下。Java 8 引入的 Stream API 和 Kotlin 在一定程度上改善了这一状况,但仍不及 SQL 简洁。 SPL 作为一种解释型动态语言,提供了比 SQL 更强大的结构化数据处理能力,支持丰富的计算函数和流程控制语句,代码简洁易维护,且可无缝集成到 Java 应用中,支持多种数据源,适用于复杂业务逻辑的开发。

Java 很长时间都没有提供直接的数据集运算语法,写个简单的 SUM 都要很多行,更不要说分组、排序等复杂运算了。完全同样数据处理功能的代码远比 SQL 长,开发效率低下。
从 Java8 开始,Stream 登场,提供了支持 Lambda 语法的集合运算类。程序员不再为 SUM 就写很多行了,常规的分组、排序都有了现成函数。
数据集上的排序写成这样,比早期 Java 确实方便很多:

Stream<Order> result=Orders
.sorted((sAmount1,sAmount2)->Double.compare(sAmount1.Amount,sAmount2.Amount))
.sorted((sClient1,sClient2)->CharSequence.compare(sClient2.Client,sClient1.Client));

不过,和 SQL 相比,方便程度仍然差距不小:

select * from Orders order by Client desc, Amount

更复杂一些的分组汇总

Calendar cal=Calendar.getInstance();
Map<Object, DoubleSummaryStatistics> c=Orders.collect( Collectors.groupingBy(
    r->{
   
        cal.setTime(r.OrderDate);
        return cal.get(Calendar.YEAR) + "_" + r.SellerId;
    }, 
    Collectors.summarizingDouble(r->{
   return r.Amount;})
));
for(Object Sellerid:c.keySet()){
   
    DoubleSummaryStatistics r =c.get(Sellerid);
    String year_sellerid[]=((String)Sellerid).split("_");
    System.out.println("group is (year):"+year_sellerid[0]+"\t (sellerid):"+year_sellerid[1]+"\t sum is:"+r.getSum()+"\t count is:"+r.getCount());
}

大体等价于 SQL 语句:

select year(OrderDate), Sellerid, sum(Amount), count(1) from Orders group by year(OrderDate), Sellerid

差距相当明显。

基于 Stream 又发展出了 Kotlin,它不再直接使用 Java 语言,这样不再受 Java 的局限,可以使用新的语法和符号,写出更简洁的 Lambda 表达式。
比如前面那个排序:

var resutl=Orders.sortedBy{
   it.Amount}.sortedByDescending{
   it.Client}

简洁程度已经和 SQL 很接近了。
但面对复杂些的运算,仍然不够方便,比如前述的分组汇总:

data class Grp(var OrderYear:Int,var SellerId:Int)
data class Agg(var sumAmount: Double,var rowCount:Int)
var result=Orders.groupingBy{
    Grp(it.OrderDate.year+1900,it.SellerId) }
    .fold( Agg(0.0,0),{
   acc, elem -> Agg(acc.sumAmount + elem.Amount,acc.rowCount+1) })
    .toSortedMap(compareBy<Grp> {
    it. OrderYear}.thenBy {
    it. SellerId} )
result.forEach{
    println("group fields:${it.key.OrderYear}\t${it.key.SellerId}\t aggregate fields:${it.value.sumAmount}\t${it.value.rowCount}") }

虽然比 Stream 简单了,但和 SQL 还是没法比。

看来,想在 Java 中取代 SQL(以获得更好的架构)编写结构化数据集相关的业务逻辑,Stream 和 Kotlin 还需要继续进化。
开源软件 SPL 可以一步到位实现 Stream 和 Kotlin 的目标。
SPL 也是纯 Java 的开源软件,和 Stream 和 Kotlin 类似,都可以完全无缝地集成进 Java 应用中,一起享受成熟 Java 框架的优势。

和 Kotlin 类似, SPL做为全新的编程语言。但它并不是从 Stream 和 Kotlin 发展而来的。
为什么要设计一种新的程序语言而不直接封装成 Java API 呢?
Java 是编译型的静态语言,在这个基础上很难实现动态数据结构和便捷的 Lambda 语法,而这又是结构化数据运算中特别常见的,也是 SQL 的优势所在。
SQL 中任何一个 SELECT 语句都会产生一个新的数据结构,可以随意添加删除字段,而不必事先定义结构(类),这在结构化数据运算中家常便饭。但 Java 这类语言却不行,在代码编译阶段就要把用到的结构(类)都定义好,可以认为不能在执行过程中动态产生新的类(Java 理论上支持动态编译,但复杂度太大)。如果用一个专门的类来表示所有数据表,把字段名也作为类的数据成员,这又不能直接使用类的属性语法来引用字段,代码非常麻烦。
Lambda 语法是在 SQL 中大量使用,比如 WHERE 中的条件,本质上就是个 Lambda 表达式。Java 这种静态语言虽然现在也支持 Lambda 语法,但方便程度远远不如 SQL。每次书写时还是要有个函数头定义来告诉编译器现在要写 Lambda 函数了,代码看着很乱。在 Lambda 函数中也不能直接引用数据表的字段名,比如用单价和数量计算金额时,如果用于表示当前成员的参数名为 x,则需要写成 "x. 单价 x. 数量" 这种啰嗦的形式。而在 SQL 中可以更为直观地写成 "单价 数量"。
解释型的动态语言才能实现 SQL 的这些特征,可以随时生成新的数据结构,也可以根据宿主函数本身决定当前参数是不是 Lambda 函数,从而没必要写个定义头,更可以根据上下文正确引用未写表名的字段。
SQL 是解释型动态语言,SPL 也是。Java 以及 Java 基础上的 Kotlin 和 Scala 都不是,所以用这些语言很难书写出简洁的代码。

在解释型动态语言基础上,SPL 提供了比 SQL 更完善的结构化数据对象(表、记录、游标)和更丰富的计算函数,包括 SQL 中有的过滤、分组、连接等基本运算,还有 SQL 中缺失的有序、集合等运算。所以,SPL 代码通常会比 SQL 更简洁易维护,比 Stream 和 Kotlin 就更强得多。
前面两个排序和分组运算,用 SPL 写出来比 SQL 更简洁:

Orders.sort( -Client, Amount)
Orders.groups( year(OrderDate), Sellerid; sum(Amount), count(1) )

更复杂一些的任务,比如这个任务,计算一支股票最长连续上涨的天数,SQL 要写成多层嵌套,冗长且难懂:

select max(ContinuousDays) from (
select count(*) ContinuousDays from (
select sum(UpDownTag) over (order by TradeDate) NoRisingDays from (
select TradeDate,case when Price>lag(price) over (order by TradeDate) then 0 else 1 end UpDownTag from Stock ))
group by NoRisingDays )

Stream 和 Kotlin 缺乏窗口函数等支持,同样的计算逻辑写出来更会困难得多也长得多,而用 SPL 就非常简单:

Stock.sort(TradeDate).group@i(Price<Price[-1]).max(~.len())

SPL 还有完善的流程控制语句,像 for 循环,if 分支都不在话下,还支持子程序调用。只用 SPL 就能实现非常复杂的业务逻辑,直接构成完整的业务单元,不需要上层 Java 代码来配合,主程序只要简单地调用 SPL 脚本就可以了。
esProc SPL 是纯 Java 程序,它可以被 Java 调用,也可以调用 Java。这样即便有个别用 SPL 不易实现而要使用 Java 实现的代码(比如某些对外的接口)或者已经有的现成 Java 代码,也都可以再集成进 SPL 中。SPL 脚本和主 Java 应用程序可以融为一体。

作为解释型语言,SPL 脚本可以存储成文件,置于主应用程序之外,代码修改可以独立进行且立即生效,不像基于 Stream 和 Kotlin 写的代码在修改后还要和主程序一起重新编译,整个应用都要停机重启。这样可以做到业务逻辑的热切换,特别适合支持变化频繁的业务。

4a8fe11526084d5e22730c5c756dead5_e76b48cd7f524b5f895fa8d786323466_clipboard.png

SPL 支持的数据源也很丰富,无论关系数据库还是 NoSQL 或者 Kafka、Restful,无论是常规二维表还是多层次的 json,SPL 都可以计算直接读取后处理。而 Stream 或 Kotlin 都不涉及这些内容,还需要自己写 Java 代码访问。

70215fbaa0bf72f0c29229ed4cf2ae08_dfc2a453b9af41198c3d19a9913cc08b_clipboard.png

非常特别地,SPL 代码写在格子里,这和通常写成文本的代码很不一样。独立的开发环境简洁易用,提供单步执行、设置断点、所见即所得的结果预览,调试开发更方便。

ab2f068fed126d9c4fb3c2dd723bdf16_b020d43ec7884123ba721c9fd0735080_clipboard.png

SPL是开源的,乾学院对 SPL 有更详细的介绍。

相关文章
|
4天前
|
存储 人工智能 弹性计算
阿里云弹性计算_加速计算专场精华概览 | 2024云栖大会回顾
2024年9月19-21日,2024云栖大会在杭州云栖小镇举行,阿里云智能集团资深技术专家、异构计算产品技术负责人王超等多位产品、技术专家,共同带来了题为《AI Infra的前沿技术与应用实践》的专场session。本次专场重点介绍了阿里云AI Infra 产品架构与技术能力,及用户如何使用阿里云灵骏产品进行AI大模型开发、训练和应用。围绕当下大模型训练和推理的技术难点,专家们分享了如何在阿里云上实现稳定、高效、经济的大模型训练,并通过多个客户案例展示了云上大模型训练的显著优势。
|
8天前
|
存储 人工智能 调度
阿里云吴结生:高性能计算持续创新,响应数据+AI时代的多元化负载需求
在数字化转型的大潮中,每家公司都在积极探索如何利用数据驱动业务增长,而AI技术的快速发展更是加速了这一进程。
|
4天前
|
人工智能 运维 双11
2024阿里云双十一云资源购买指南(纯客观,无广)
2024年双十一,阿里云推出多项重磅优惠,特别针对新迁入云的企业和初创公司提供丰厚补贴。其中,36元一年的轻量应用服务器、1.95元/小时的16核60GB A10卡以及1元购域名等产品尤为值得关注。这些产品不仅价格亲民,还提供了丰富的功能和服务,非常适合个人开发者、学生及中小企业快速上手和部署应用。
|
13天前
|
人工智能 弹性计算 文字识别
基于阿里云文档智能和RAG快速构建企业"第二大脑"
在数字化转型的背景下,企业面临海量文档管理的挑战。传统的文档管理方式效率低下,难以满足业务需求。阿里云推出的文档智能(Document Mind)与检索增强生成(RAG)技术,通过自动化解析和智能检索,极大地提升了文档管理的效率和信息利用的价值。本文介绍了如何利用阿里云的解决方案,快速构建企业专属的“第二大脑”,助力企业在竞争中占据优势。
|
15天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3936 2
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
4天前
|
算法 安全 网络安全
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
2024阿里云11.11金秋云创季活动火热进行中,活动月期间(2024年11月01日至11月30日)通过折扣、叠加优惠券等多种方式,阿里云WoSign SSL证书实现优惠价格新低,DV SSL证书220元/年起,助力中小企业轻松实现HTTPS加密,保障数据传输安全。
502 3
阿里云SSL证书双11精选,WoSign SSL国产证书优惠
|
11天前
|
安全 数据建模 网络安全
2024阿里云双11,WoSign SSL证书优惠券使用攻略
2024阿里云“11.11金秋云创季”活动主会场,阿里云用户通过完成个人或企业实名认证,可以领取不同额度的满减优惠券,叠加折扣优惠。用户购买WoSign SSL证书,如何叠加才能更加优惠呢?
985 3
|
8天前
|
机器学习/深度学习 存储 人工智能
白话文讲解大模型| Attention is all you need
本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档,我们期望为读者提供一个全面的理解,帮助大家掌握大模型的工作原理,增强与客户沟通的技术基础。本文档适合对大模型感兴趣的人员阅读。
411 17
白话文讲解大模型| Attention is all you need
|
8天前
|
算法 数据建模 网络安全
阿里云SSL证书2024双11优惠,WoSign DV证书220元/年起
2024阿里云11.11金秋云创季火热进行中,活动月期间(2024年11月01日至11月30日),阿里云SSL证书限时优惠,部分证书产品新老同享75折起;通过优惠折扣、叠加满减优惠券等多种方式,阿里云WoSign SSL证书将实现优惠价格新低,DV SSL证书220元/年起。
560 5
|
4天前
|
安全 网络安全
您有一份网络安全攻略待领取!!!
深入了解如何保护自己的云上资产,领取超酷的安全海报和定制鼠标垫,随时随地提醒你保持警惕!
697 1
您有一份网络安全攻略待领取!!!