joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会

joo工作流

越来越多的人通过为他们的业务采用功能性编程来赶上我们平台的最新更新。

在Data Geekery ,我们将Java 8用于jOOQ集成测试,因为将新的Streams API与lambda表达式一起使用使生成临时测试数据变得非常容易。

但是, 我们并不认为JDK提供了尽可能多的功能 ,这就是为什么我们还实现并开源了jOOλ的原因 , jOOλ是一个弥补这些缺点的小型实用程序库。


注意,我们的目的不是要替换更复杂的库,例如Functionaljava 。 jOOλ实际上只是在弥补缺点。

将lambda与jOOλ或jOOQ一起使用

我最近遇到了这个Stack Overflow问题 ,该问题要求将所有列的结果集流式传输到单个列表中。 例如:

输入项

+----+------------+------------+
| ID | FIRST_NAME | LAST_NAME  |
+----+------------+------------+
|  1 | Joslyn     | Vanderford |
|  2 | Rudolf     | Hux        |
+----+------------+------------+

输出量

1
Joslyn
Vanderford
2
Rudolf
Hux

这是使用函数式编程而非迭代解决方案的典型教科书示例:

迭代解

ResultSet rs = ...;
ResultSetMetaData meta = rs.getMetaData();List<Object> list = new ArrayList<>();while (rs.next()) {for (int i = 0; i < meta.getColumnCount(); i++) {list.add(rs.getObject(i + 1));}
}

事实是,迭代解决方案并没有那么糟糕,但是让我们了解如何通过函数式编程来实现这一点

使用jOOλ

jool-logo-黑色

由于以下几个原因,我们在本示例中使用jOOλ:

  • JDBC并没有真正采用新功能。 即使有,也没有简单的ResultSetStream转换。
  • 不幸的是,新的功能接口不允许抛出已检查的异常。 在Lambda内try .. catch块看起来并不好看
  • 有趣的是,如果不实现IteratorSpliterator Iterator ,就无法生成有限的流

因此,这是简单的代码:

ResultSet rs = ...;
ResultSetMetaData meta = rs.getMetaData();List<Object> list =
Seq.generate().limitWhile(Unchecked.predicate(v -> rs.next())).flatMap(Unchecked.function(v -> IntStream.range(0, meta.getColumnCount()).mapToObj(Unchecked.intFunction(i ->rs.getObject(i + 1))))).toList()

到目前为止,这看起来比迭代解决方案冗长(或更多)。 如您所见,这里需要几个jOOλ扩展:

// This generate is a shortcut to generate an
// infinite stream with unspecified content
Seq.generate()// This predicate-based stream termination
// unfortunately doesn't exist in the JDK
// Besides, the checked exception is wrapped in a
// RuntimeException by calling Unchecked.wrapper(...).limitWhile(Unchecked.predicate(v -> rs.next()))// Standard JDK flatmapping, producing a "nested"
// stream of column values for the "outer" stream
// of database rows.flatMap(Unchecked.function(v -> IntStream.range(0, meta.getColumnCount()).mapToObj(Unchecked.intFunction(i ->rs.getObject(i + 1)))))// This is another convenience method that is more
// verbose to write with standard JDK code.toList()

使用jOOQ

jOOQ拥有更多便利API,可用于处理SQL语句的结果记录。 考虑以下逻辑:

ResultSet rs = ...;List<Object> list =
DSL.using(connection).fetch(rs).stream().flatMap(r -> Arrays.stream(r.intoArray())).collect(Collectors.toList());

请注意,上面的示例使用的是标准JDK API,为了方便起见,没有使用jOOλ。 如果要将jOOλ与jOOQ一起使用,甚至可以编写:

ResultSet rs = ...;List<Object> list = 
Seq.seq(DSL.using(connection).fetch(rs)).flatMap(r -> Arrays.stream(r.intoArray())).toList();

简单? 我会这样说! 让我们记住这个例子:

  • 将JDBC ResultSet提取到Java集合中
  • 将结果集中的每个记录转换为列值数组
  • 将每个数组转换为流
  • 将流平展为流
  • 将所有值收集到一个列表中

ew!

结论

我们正在走向激动人心的时代! 直到所有Java 8习惯用法和功能思想对于企业中的Java开发人员来说都是“自然”的过程,这将需要一段时间。

但是,拥有一种可以配置为表示为lambda表达式的流水线数据转换的数据源的想法非常引人注目。 jOOQ是一种API,它以非常流畅和直观的方式封装了SQL数据源 ,但并不仅限于此。 jOOQ生成常规的JDK记录集合,可以通过新的stream API对其进行即用转换。

我们相信,这将彻底改变Java生态系统对数据转换的思考方式 。 请继续关注此博客上的更多示例 !

翻译自: https://www.javacodegeeks.com/2014/10/dont-miss-out-on-writing-java-8-sql-one-liners-with-jooλ-or-jooq.html

joo工作流

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

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

相关文章

session mysql登录实现_PHP+MYSQL+MYSQL+SESSION实现用户登录的实例

这是我写的用户登录界面。session_start();include(menu2.php);require(configywcl.php);//加载配置文件require(functions.php);?>请登录系统if ($username){$passwordmd5($password);$sql"select * from user where username$username and password$password";…

使用OpenSSL加密,使用Java解密,使​​用OpenSSL RSA公钥

抽象 在2017年&#xff0c;我撰写了一个由三部分组成的系列文章&#xff0c;内容涉及选择最佳的哈希和加密算法。 在对该系列进行研究时&#xff0c;我学到了很多有关哈希和加密的知识。 我学到的最重要的事情是&#xff0c;尽管我必须对如何使用最安全的算法进行自我教育&…

axture动画原型制作_Axure制作原型-基础操作

产品原型从类型可以分为手稿、线框图、低保真、高保真几种效果&#xff0c;在制作的时候分为不同场景来决定我们的输出物类型。比如在会议中为了快速的确定产品规划方向&#xff0c;迅速的记录及表达出当前灵感的碰撞&#xff0c;这个时候通常使用手稿的形式快速绘制&#xff0…

有效Java第三版的源代码已更新为使用较新的功能

那些已经阅读了有效Java 第三版的人可能知道与该书相关的源代码可以在GitHub上获得 。 jbloch / efficiency-java-3e-source-code项目拥有1700多个星星&#xff0c;截至撰写本文时&#xff0c;它已被分叉了近800次。 在有效Java的第三版中&#xff0c; Java的版本主要是JDK 8&a…

mysql 远程连接取消权限_MYSQL远程登录权限设置

Mysql默认关闭远程登录权限&#xff0c;如下操作允许用户在任意地点登录&#xff1a;1. 进入mysql&#xff0c;GRANT ALL PRIVILEGES ON *.* TO root% IDENTIFIED BY WITH GRANT OPTION;IDENTIFIED BY后跟的是密码&#xff0c;可设为空。2. FLUSH privileges; 更新Mysql为了安…

spring和spring_Spring WebApplicationInitializer和ApplicationContextInitializer的混淆

spring和spring我偶尔会混淆这两个概念-WebApplicationInitializer和ApplicationContextInitializer&#xff0c;并希望描述它们中的每一个&#xff0c;以便为我自己澄清它们。 我以前曾在这里写过有关WebApplicationInitializer的博客。 它仅在符合Servlet 3.0规范的Servlet容…

mybatis mysql demo_SpringBoot(入门Demo,整合mybatis,连接mysql)

1.简介SpringBoot提供一种固定的、约定优于配置风格的框架&#xff0c;使开发者更快地创建基于spring的应用和程序。可以高效的创建基于Spring的应用服务(SpringBoot不是对spring功能的增强&#xff0c;而是可以更快速使用spring)。为微服务spring cloud铺路&#xff0c;可整合…

HttpClient 4 API –获取状态码-getStatusLine()。getStatusCode()示例

在HttpClient API中获取状态代码的快速指南。 getStatusLine&#xff08;&#xff09;。getStatusCode&#xff08;&#xff09;示例和相关的错误。 1.简介 在这个非常快速的教程中&#xff0c;我将展示如何使用HttpClient 4获取和验证HTTP响应的StatusCode。 2. Maven依赖 要…

css table嵌套内部table不受外部影响_HTML+CSS网页一揽子(4)

CSS重要属性之浮动基本属性&#xff1a;float:left&#xff1b;左浮动float:right&#xff1b;右浮动float:none&#xff1b;不浮动(一般应用于覆盖既有浮动属性时使用)clear:both&#xff1b;清除浮动对其他元素带来的影响应用场景&#xff1a;(1)网站大的结构布局&#xff1a…

ejb构建_如何使用单例EJB和MBean构建和清除参考数据缓存

ejb构建在我的一个项目中&#xff0c;我需要使用EclipseLink作为ORM框架从Java EE 6 WebLogic环境中的多个源中加载参考数据。 由于我在Java EE世界中找不到与Spring YET的Cacheable相当的注释&#xff0c;因此我不得不编写自己的缓存解决方案。 尽管参考数据几乎不会随时间变化…

mysql ticks_【原创】C# 计时周期数(Ticks)在不同数据库上的实现

动手之前&#xff0c;先来看看 Ticks 在微软官方文档上的定义&#xff1a;注解一个计时周期表示一百纳秒&#xff0c;即一千万分之一秒。1 毫秒内有 10,000 个计时周期&#xff0c;即 1 秒内有 1,000万个计时周期。此属性的值表示自0001年1月1日午夜12:00:00 0:00:00 (公历日期…

在Spring Boot测试中使用Testcontainer进行数据库集成测试

在此博客文章中&#xff0c;我想演示如何在Spring Boot测试中集成Testcontainer以便与数据库一起运行集成测试。 我没有使用Testcontainers的Spring Boot模块。 如何与他们合作&#xff0c;我将在另一篇博客文章中进行介绍。 所有示例都可以在GitHub上找到 。 为什么要使用测试…

php模块安装 pdo_mysql_关于php插件pdo_mysql的安装

今天在做一个商城的连接的时候&#xff0c;需要MpDO验证。需要安装pdo_mysql模块&#xff0c;刚开始按照php扩展模块的安装按照这个安装ZIP,curl都成功了但是安装pdo_mysql却不行&#xff0c;在./configure --with-php-config/usr/local/php/bin/php-config是出现错误。如下che…

java8串行和并行的区别_垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)...

java8串行和并行的区别4个Java垃圾收集器–错误的选择如何严重影响性能 在2014年&#xff0c;对于大多数开发人员来说&#xff0c;还有两件事仍然是个谜&#xff1a;垃圾收集和了解异性。 由于我对后者知之甚少&#xff0c;所以我认为我会对前者大吃一惊&#xff0c;尤其是因为…

python函数参数学习_python学习笔记-11.函数参数和返回值进阶

1. 函数参数和返回值的作用函数根据有没有参数以及有没有返回值&#xff0c;可以相互组合&#xff0c;共有4种形式&#xff1a;无参数&#xff0c;无返回值无参数&#xff0c;有返回值有参数&#xff0c;无返回值有参数&#xff0c;有返回值定义函数时&#xff0c;是否接收参数…

java spr_Java中的42行代码中的URL缩短器服务(Java(?!)Spring Boot + Redis

java spr显然&#xff0c;编写URL缩短服务是新的“ Hello&#xff0c;world&#xff01; ”在IoT /微服务/时代的世界中。 一切始于在45行Scala中的URL缩短服务 -整洁的Scala&#xff0c;以Spray和Redis进行调味以进行存储。 紧随其后的是&#xff0c; 在35行Clojure中提供了ur…

python邮件发送哪个好_python发邮件(一)

复习模块如果我们要发送邮件&#xff0c;就需要用到smtplib模块的以下方法&#xff1a;1、import smtplib #引入smtplib模块2、server smtplib.SMTP() #server为变量&#xff0c;通过SMTP指定一个服务器&#xff0c;这样才能把邮件送到另一个服务器&#xff0c;SMTP…

SSL Kafka经纪人从Kafka Mirror Maker迁移到Brooklin的挑战

问题 从卡夫卡镜子制造商转移到布鲁克林有我在这里所写的优势。 但是&#xff0c;进行这种迁移并不容易&#xff0c;因为它本来应该如此。 我面临的主要挑战是&#xff1a;在消费者Kafka经纪人和Brooklin之间建立SSL连接 解 SSL问题 事实证明&#xff0c;这个问题比我预期的要…

mysql移动数据的语句是_mysql基本语句

MySQL关系型数据库RDS中的老大哥&#xff0c;增删改查是MySQL入门的基础增删改查语句增删改查的语句命令为增&#xff1a;insert删&#xff1a;delete改&#xff1a;update查&#xff1a;SELECT或者show库操作创建数据库&#xff1a;create database shujukuba;创建带字符集的数…

jetty嵌入式容器_嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务

jetty嵌入式容器最近&#xff0c;我遇到了一个非常有趣的问题&#xff0c;我认为这只需要几分钟就可以解决&#xff1a;在Linux中使用Spring Security &#xff08;当前稳定版本3.2.5 &#xff09;保护Apache CXF &#xff08;当前版本3.0.1 &#xff09;/ JAX-RS REST服务。在…