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

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

在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

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

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

相关文章

Redis---概述

1.概述 Redis是速度非常快的非关系型&#xff08;NoSQL&#xff09;内存键值数据库&#xff0c;可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串&#xff0c;值支持五种数据类型&#xff1a;字符串&#xff0c;列表&#xff0c;集合&#xff0c;散列表&#xf…

AJAX Control Toolkit——DropShadow(阴影和圆角框)

该控件的效果就是可以使相应的Panel产生阴影和圆角框的效果&#xff0c;要说的是该控件在CSS3来临之际并不存在多大的意义了&#xff0c;因为在CSS3中同样可以实现而且更加理想的效果。 但是要说明的是不要为目标Panel添加过多的CSS属性&#xff0c;不然会出现预料之外的效果&a…

node实现简单的群体聊天工具

一、使用的node模块 1、express当做服务器 2、socket.io 前后通信的桥梁 3、opn默认打开浏览器的模块(本质上用不到) 难点&#xff1a;前后通信 源码地址&#xff1a;https://github.com/wjf444128852/SimpleChat 欢迎clone并运行、扩展改进、issues 二、基础样子&#…

CSS中的三种样式来源:创作人员、读者和用户代理

查看原文&#xff1a;https://www.cnblogs.com/JJJJJKKKKK/articles/4542545.html CSS中的样式一共有三种来源&#xff1a;创作人员、读者和用户代理&#xff0c;来源的不同会影响到样式的层叠方式&#xff0c;很多第一次学习CSS的朋友&#xff0c;对这三种来源可能会存在一些…

具有jOOQ和Java 8的CompletableFuture的异步SQL执行

响应式编程是一个新的流行词&#xff0c;它实际上仅表示异步编程或消息传递。 事实是&#xff0c;函数语法极大地帮助构建了异步执行链&#xff0c;今天&#xff0c;我们将看到如何使用jOOQ和新的CompletableFuture API在Java 8中做到这一点。 实际上&#xff0c;事情很简单&…

关于模板引擎handlebars.js基本用法

说明&#xff1a;模板引擎主要针对于渲染DOM&#xff0c;取代了字符串拼接&#xff0c;用下面的代码亲测handlebars模板引擎比字符串拼接渲染DOM慢了20ms&#xff0c; 这里配置一个在线DEMO&#xff0c;简单说明下handlebars.js的基本用法&#xff0c;需要根据获取的数据去渲染…

create react app创建的项目运行test的时候不能解析webpack的alisa配置的问题

使用babel插件npm install babel-plugin-module-resolver&#xff0c;并在.babelrc文件中加入如下&#xff1a; {"plugins": [["module-resolver",{"alias": {"": "./src"}}]] }详情查看babel-plugin-module-resolver插件文…

使用Spring Security的多租户应用程序的无状态会话

从前&#xff0c; 我发表了一篇文章&#xff0c;解释了构建无状态会话的原理 。 巧合的是&#xff0c;我们再次针对多租户应用程序执行同一任务。 这次&#xff0c;我们将解决方案集成到Spring Security框架中&#xff0c;而不是自己构建身份验证机制。 本文将解释我们的方法和…

C# 退出提示 事件提示两次问题

private void frmCtiState_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason CloseReason.ApplicationExitCall) return; DialogResult result MessageBox.Show("是否退出系统?", "消息", MessageBoxB…

What?一个 Dubbo 服务启动要两个小时!

前言 前几天在测试环境碰到一个非常奇怪的与 dubbo 相关的问题&#xff0c;事后我在网上搜索了一圈并没有发现类似的帖子或文章&#xff0c;于是便有了这篇。 希望对还未碰到或正在碰到的朋友有所帮助。 现象 现象是这样的&#xff0c;有一天测试在测试环境重新部署一个 dubbo …

React hook 中的数据获取

相关说明&#xff1a; 对于hook相关词不翻译&#xff0c;感觉翻译后怪怪的。 effect hook 效果钩子&#xff0c;用于执行一些副作用例如获取数据 。 state hook 状态钩子。 使用----------- 和 ----------- 标出代码需要关注的地方。 渣翻译如下&#xff1a; 在这个指南中…

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

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

我所知道的前端组件化与模块化

序言&#xff1a;组件化&#xff1f;模块化&#xff1f;这都是什么鬼&#xff1f;这是最初看到这2个新名词的反应。随着时间的推移&#xff0c;似乎、可能、大概明白了一点&#xff0c;于是想说说自己的理解(仅仅是自己的理解) 一、组件化 忘记什么时候看到这个词的了&#x…

关于通过反汇编查看dll的方法【转】(

关于通过反汇编查看dll的方法【转】( http://blog.sina.com.cn/s/blog_51a3c0380100f9md.html 今天想看一个dll的内容&#xff0c;苦于没有相关工具&#xff0c;从csdn上找到有这么段文字&#xff0c;收益匪浅啊&#xff0c;收藏&#xff01; 可以通过反汇编来知道接口函数的参…

openocd安装与调试

环境&#xff1a; 硬件&#xff1a;PC机<------>ARM仿真器v8.00<------>已下载好bit流的Xinlinx SoC开发板&#xff08;其上有arm cortex-a9核&#xff09; 软件&#xff1a;Redhat Linux6&#xff08;或虚拟机&#xff09; openocd 使用openocd下载程序&#xff…

在React中获取数据

React初学者经常从不需要获取数据的应用开始。他们经常面临一个计数器&#xff0c;任务列表获取井字棋游戏应用。这是很好的&#xff0c;因为在开始学习React的时候&#xff0c;数据获取在你的应用中添加了另一层复杂度。 然而&#xff0c;有些时候你想要从自己的或者第三方AP…

使用Project Lombok减少Java应用程序中的样板代码

对Java编程语言最常提出的批评之一是它需要大量的样板代码 。 对于简单的类尤其如此&#xff0c;该类只需要存储一些值就可以。 您需要这些值的getter和setter&#xff0c;也许您还需要一个构造函数&#xff0c;覆盖equals&#xff08;&#xff09;和 hashcode&#xff08;&am…

DOM之城市二级联动

1、HTML内容 <select id"province"><option>请选择</option><option>山东省</option><option>吉林省</option><option>上海市</option></select><select id"city"><option>请选择…

跳转指令-JMP

page 60,132TITLE A0405Jump(EXE) JMP跳转指令.MODEL SMALL.STACK 64.DATAORG 100H ;规定程序的起始地址A10MAIN PROC NEARMOV AX,00MOV BX,00MOV CX,1A20: ADD AX,01ADD BX,AXSHL CX,1 ;左移一位JMP A20 ;跳转到A20A10MAIN endp jmp格式 [label:] jmp short/near/far/address…

java输出毫秒时间

SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");// 输出字符串System.out.println(df.format(new Date()));转载于:https://www.cnblogs.com/longchang/p/11139947.html