倍增 Java 程序员的开发效率

简介: 应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。

应用计算困境
顾开发还是顾架构?
Java 是当前应用开发最常用的语言,但是 Java 写数据处理的代码并不简单,比如针对两个字段的分组汇总要写成这样:

Map<Integer, Map<String, Double>> summary = new HashMap<>();
    for (Order order : orders) {
        int year = order.orderDate.getYear();
        String sellerId = order.sellerId;
        double amount = order.amount;
        Map<String, Double> salesMap = summary.get(year);
        if (salesMap == null) {
            salesMap = new HashMap<>();
            summary.put(year, salesMap);
        }
        Double totalAmount = salesMap.get(sellerId);
        if (totalAmount == null) {
            totalAmount = 0.0;
        }
        salesMap.put(sellerId, totalAmount + amount);
    }
    for (Map.Entry<Integer, Map<String, Double>> entry : summary.entrySet()) {
        int year = entry.getKey();
        Map<String, Double> salesMap = entry.getValue();
        System.out.println("Year: " + year);
        for (Map.Entry<String, Double> salesEntry : salesMap.entrySet()) {
            String sellerId = salesEntry.getKey();
            double totalAmount = salesEntry.getValue();
            System.out.println("  Seller ID: " + sellerId + ", Total Amount: " + totalAmount);
        }
    }

相比之下 SQL 就要简单很多,一句 group by 就出来了。

SELECT year(orderdate),sellerid,sum(amount) FROM orders GROUP BY year(orderDate),sellerid
早期应用程序的确就是 Java 和 SQL 配合工作的,业务流程在应用端用 Java 实现,而数据处理则放到后端数据库中使用 SQL 实现。这种架构因为受制于数据库而难以扩展和移植,对现代应用很不友好,而且很多时候还面临无库或跨库的情况,也没有 SQL 可用。

所以后来很多应用也开始采用全 Java 架构,特别是微服务的兴起以后,数据库只做简单读写,业务流程和数据处理都在应用端通过 Java 实现,这样就能与数据库解耦,获得良好的扩展和移植性,从而带来架构上的优势。但这又会面临前面提到的 Java 开发难问题。

看起来开发和架构只能顾一头,用 Java 享受架构的优势就必须忍受开发困难,反之用 SQL 就要容忍架构上的缺点,面临两难境地。

还有什么办法?
那我们想办法增强 Java 的数据处理能力呢?这样既能避免了 SQL 的问题,同时还能克服 Java 的不足。

事实上,Java 下的 Stream、Kotlin、Scala 都在尝试做这件事。

Stream

Java8 以后引入的 Stream,增加了很多数据处理方法,前面的计算用 Stream 实现。

Map<Integer, Map<String, Double>> summary = orders.stream()
            .collect(Collectors.groupingBy(
                    order -> order.orderDate.getYear(),
                    Collectors.groupingBy(
                            order -> order.sellerId,
                            Collectors.summingDouble(order -> order.amount)
                    )
            ));

    summary.forEach((year, salesMap) -> {
        System.out.println("Year: " + year);
        salesMap.forEach((sellerId, totalAmount) -> {
            System.out.println("  Seller ID: " + sellerId + ", Total Amount: " + totalAmount);
        });
    });

Stream 的确能一定程度简化计算代码,但整体来看仍然繁琐,远不及 SQL 简洁。

Kotlin

而号称更强大的 Kotlin 则有进一步改进:

val summary = orders
        .groupBy { it.orderDate.year }
        .mapValues { yearGroup ->
            yearGroup.value
                .groupBy { it.sellerId }
                .mapValues { sellerGroup ->
                    sellerGroup.value.sumOf { it.amount }
                }
        }
    summary.forEach { (year, salesMap) ->
        println("Year: $year")
        salesMap.forEach { (sellerId, totalAmount) ->
            println("  Seller ID: $sellerId, Total Amount: $totalAmount")
        }
    }

Kotlin 也简单了一些,但还是不够,和 SQL 的差距仍然很大。

Scala

再看看 Scala:

val summary = orders
        .groupBy(order => order.orderDate.getYear)
        .mapValues(yearGroup =>
            yearGroup
                .groupBy(_.sellerId)
                .mapValues(sellerGroup => sellerGroup.map(_.amount).sum)
    )
    summary.foreach { case (year, salesMap) =>
        println(s"Year: $year")
        salesMap.foreach { case (sellerId, totalAmount) =>
            println(s"  Seller ID: $sellerId, Total Amount: $totalAmount")
        }
    }

Scala 则又简单了一些,但仍然不能和 SQL 同日而语。Scala 还有过于沉重的缺点,使用起来并不方便。

其实这些技术的发展方向是对的,只是现在做的还不够好。

编译语言难以热切换
另外,Java 这些作为编译语言,不支持热切换,修改代码要重新编译部署,经常要重启服务,响应多变需求时的体验恶劣。SQL 在这方面反而没问题。

Java 开发麻烦,架构也有缺点,SQL 架构上很难满足,两难困境很难解决。还有什么办法吗?

终极解决办法 SPL,还有 SPL,纯 Java 开发的数据处理语言,开发简单、架构灵活。

语法简洁
我们回顾前面分组汇总的计算,Java 这些的实现:

3b342b9b2d1466c489bd11fcbf55b42a_1721999233107100.png

相比之下,SPL 则要简洁得多:
QQ_1730859339496.png

这已经与 SQL 的实现一样简单了:

QQ_1730859355407.png

SELECT year(orderdate),sellerid,sum(amount) FROM orders GROUP BY year(orderDate),sellerid
其实,很多时候 SPL 代码比 SQL 更简单。由于对有序计算和过程计算的支持,SPL 更擅长完成一些复杂计算。比如计算股票连涨天数, SQL 要嵌套三层,别说写,读懂都不容易。

select max(continuousDays)-1
  from (select count(*) continuousDays
    from (select sum(changeSign) over(order by tradeDate) unRiseDays
       from (select tradeDate,
          case when closePrice>lag(closePrice) over(order by tradeDate)
          then 0 else 1 end changeSign
          from stock) )
group by unRiseDays)

这个计算 SPL 一句就能完成,比 SQL 简单很多,更是能甩 Java 那些几条街。

QQ_1730859393480.png

完善、独立的计算能力
SPL 提供了专业的结构化数据对象序表,并在序表的基础上提供了丰富的计算类库。包括常规的过滤、分组、排序、去重、连接等计算,比如一般的:

QQ_1730859436264.png

更重要的是,SPL 的计算能力与数据库无关,没有数据库时一样可以工作,具备独立的计算能力,不像 ORM 技术要翻译成 SQL 执行。

高效易用的 IDE
除了语法简单,SPL 还有功能全面的开发环境。提供单步执行、设置断点等调试功能,还有可视结果面板,可以实时查看每步计算结果,对调试非常友好。

ec777c4d73144759b489e5d183680312_1721999232332100.png

大数据支持
SPL 还支持大数据,内存装不装得下都能计算。

内存计算:
QQ_1730859489123.png

外存计算:

QQ_1730859510419.png

从上面的代码可以看到,SPL 外存计算的代码与内存计算几乎完全一样,不会额外增加工作量。

SPL 也很容易实施并行计算,只需要在串行计算代码上增加一个 @m 选项就可以,比 Java 不知道简单多少倍。
QQ_1730859527780.png

与 Java 应用无缝集成
SPL 采用 Java 开发,将 JAR 包嵌入应用即可使用,通过标准 JDBC 接口执行或调用 SPL 脚本,整体很轻,甚至可以在安卓上工作。

JDBC 调用代码:

Class.forName("com.esproc.jdbc.InternalDriver");
    con= DriverManager.getConnection("jdbc:esproc:local://");
    st =con.prepareCall("call SplScript(?)");
    st.setObject(1, "A");
    st.execute();
    ResultSet rs = st.getResultSet();
    ResultSetMetaData rsmd = rs.getMetaData();

有了轻量易集成的特点,SPL 可以无缝集成进主流 Java 框架,尤其适合在微服务框架内部充当计算引擎使用。

开放性
SPL 还具备良好的开放性,可以对接多种数据源并实时混合计算,很容易处理无库或多库场景。

78248600c2d9fd7d271a6805ff73f81a_1721999232695100.png

不管什么数据源,只要能访问到,SPL 就都能读取并混合计算,啥都行。

数据库和数据库:
QQ_1730859592185.png

RESTful 和文件:

QQ_1730859615275.png

JSON 和数据库:

QQ_1730859637524.png

解释执行热切换
SPL 是解释型语言,修改代码无需重启服务即可实时生效,天然支持不停机热切换,能更好适应需求多变的数据业务。

3ce125987a145e113cfb8f10504c4c5e_1721999232896100.png

支持热切换还可以进一步独立计算模块,单独管理和运维,使用上更加灵活方便。

有了 SPL,可以大幅提升 Java 程序员的开发效率,同时获得架构上的优势。兼顾 Java 和 SQL 优点的同时,还能进一步简化计算、提升性能。SPL 现已开源,欢迎前往乾学院沟通了解!

相关文章
|
13天前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
57 10
|
14天前
|
SQL 存储 Java
面向 Java 程序员的 SQLite 替代品
SQLite 是轻量级数据库,适用于小微型应用,但其对外部数据源支持较弱、无存储过程等问题影响了开发效率。esProc SPL 是一个纯 Java 开发的免费开源工具,支持标准 JDBC 接口,提供丰富的数据源访问、强大的流程控制和高效的数据处理能力,尤其适合 Java 和安卓开发。SPL 代码简洁易懂,支持热切换,可大幅提高开发效率。
|
20天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
40 4
|
21天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
51 4
|
27天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
51 2
|
27天前
|
监控 Java 数据库连接
在Java开发中,数据库连接管理是关键问题之一
在Java开发中,数据库连接管理是关键问题之一。本文介绍了连接池技术如何通过预创建和管理数据库连接,提高数据库操作的性能和稳定性,减少资源消耗,并简化连接管理。通过示例代码展示了HikariCP连接池的实际应用。
19 1
|
21天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
31 0
WK
|
26天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
46 0
WK
|
27天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
49 0
|
Java 程序员
java程序员,如何坚持学习下去?
java程序员,如何坚持学习下去?