不要错过使用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λ
由于以下几个原因,我们在本示例中使用jOOλ:
- JDBC并没有真正采用新功能。 即使有,也没有简单的
ResultSet
到Stream
转换。 - 不幸的是,新的功能接口不允许抛出已检查的异常。 在Lambda内
try .. catch
块看起来并不好看 - 有趣的是,如果不实现
Iterator
或Spliterator
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λ或jOOQ编写Java 8 SQL单行代码的机会相关推荐
- joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会
joo工作流 越来越多的人通过为他们的业务采用功能性编程来赶上我们平台的最新更新. 在Data Geekery ,我们将Java 8用于jOOQ集成测试,因为将新的Streams API与lambda ...
- 编写Java脚本统计工程代码总行数
在新公司工作将近一年了,一直独自一人负责服务端集群的运维和代码的编写.不知不觉从一个Project发展到了七八个Project. 看着越来越多的代码,今天突然想统计一下一共写了多少代码.[这里只统计完 ...
- java连接sql数据库代码_Java如何连接Sql的数据库
Java如何连接Sql的数据库 Java连接数据库,除了用Jdbc-Odbc桥接外,还有更实用的方法么?我是指不用配置DSN,直接和Sql连接的那种,需要安装什么驱动么?--------------- ...
- java连接sql 2008代码,java连接sql server 2008数据库代码
Java连接SQLServer 2008数据库的步骤: 1.到微软官方下载jdbc 并解压,得到sqljdbc.jar和sqljdbc4.jar,由于使用的是JDK1.7,所以使用sqljdbc4.j ...
- 用vs2017编写html,vs2017可以编写java
vs2017可以编写java [2021-02-06 06:57:17] 简介: 服务器 Dockerfile这个东西我们之前是介绍过,它方便,快捷,易用,而在vs2017中也对docker进行了支 ...
- 编写运行最简单的java程序——使用记事本编写java程序
编写运行最简单的java程序--使用记事本编写java程序 第一个java程序--使用记事本编辑 经过上篇文章的java环境搭建成功的小伙伴们可以在自己的计算机上编写属于自己的java程序了yo~ 还 ...
- java代码如何与界面联系在一起_如何在Visual Studio Code 中编写Java代码
本文将展示如何在Visual Studio Code中用Java编写和运行一个简单的Hello World程序. 首先您必须在本地开发环境中安装Java SE开发工具包(JDK) Visual Stu ...
- 编写java程序的常见问题_Java程序的编写与执行、Java新手常见的问题解决
原标题:Java程序的编写与执行.Java新手常见的问题解决 今天,我们来写一段Java程序.然后看看Java程序是如何执行的,以及Java新手小白遇到的问题和解决办法. HelloWorld的编写 ...
- 像写SQL一样编写Java数据应用-TinySqlDsl
前言 话说企业应用,一般离不开数据库.要做数据库,可以有N种方案,比如:直接采用JDBC层自己封装下使用的,采用一些框架的,如:iBatis,Hiberate,Spring JDBC Template ...
最新文章
- pku1384---Piggy-Bank(动态规划)
- Linux arm9 设置中断向量表,STM32学习笔记之中断向量表,MDK程序启动分析
- 设计模式之——工厂方法模式
- python层次聚类法画图_Python实现简单层次聚类算法以及可视化
- Spring使用AspectJ开发AOP
- 进程间通信(匿名管道、命名管道、共享内存)
- 通过js滚轮滚动时调用动画_WOW.js在页面滚动时展现动感的元素动画效果
- 关于spring mvc时间类型绑定失败解决方法
- Leetcode每日一题:88.merge-sorted-array(合并两个有序数组)
- 目标检测——Detectron2的学习笔记
- 拿去吧你,软件测试的文件和目录测试都在这
- FlowNet: Learning Optical Flow with Convolutional Networks
- vdbench 参数详解
- xshell5 可用注册码
- 盘点3种Python爬虫 中文乱码 的处理方法
- 互联网赚钱的逻辑是什么?
- WebApp开发入门
- 用于机器学习的 NumPy(ML)
- 70年,国人的奋斗史,计算机技术的追赶史
- python按回车_python中回车键
热门文章
- HBase的hbase shell 详解
- mfc定义了变量仍提示未定义标识符_JavaScript-变量
- java分布式对象RMI应用测试用例
- spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入
- 单例模式引发的内存泄漏:_资源泄漏:救援的命令模式
- react java_独眼巨人React组织了Java 8库的寒武纪爆发
- aws sqs_在Spring中将AWS SQS用作JMS提供程序
- jaxb xsd生成xml_使用JAXB和Jackson从XSD生成JSON模式
- java循坏_Java的坏功能是什么
- csrf spring_无状态Spring安全性第1部分:无状态CSRF保护