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λ

由于以下几个原因,我们在本示例中使用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工作流

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

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

    越来越多的人通过为他们的业务采用功能性编程来赶上我们平台的最新更新. 在Data Geekery ,我们将Java 8用于jOOQ集成测试,因为将新的Streams API与lambda表达式一起使用 ...

  2. java代码如何与界面联系在一起_如何在Visual Studio Code 中编写Java代码

    本文将展示如何在Visual Studio Code中用Java编写和运行一个简单的Hello World程序. 首先您必须在本地开发环境中安装Java SE开发工具包(JDK) Visual Stu ...

  3. 学生课堂提问系统java源码_课堂管理系统;在线教辅平台;java课设(示例代码)...

    # 白泽智慧教辅平台 **说明:** 运行时需要修改位置: bzedusrcmainesourcesapplication.properties bzedusrcmainesourcesconfigm ...

  4. JIRA-使用教程_工作流_创建、方案配置

    博客概要 简单分享如何在JIRA中创建一个工作流,并配置到对应方案中~ 文章目录 博客概要 <JIRA-使用教程>_总目录 工作流 创建过程 1.JIRA管理 2.配置-图形 3.配置-文 ...

  5. Java状态模式实现工作流_关于使用“状态模式”做工作流概要。

    usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceWF {//工程名称:通过工作流状态进行工作流管理///Au ...

  6. java面试题_阿里大厂流出的数百道 Java 经典面试题

    BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...

  7. react 代码编写原则_如何编写易读的React代码— 10种编码风格技巧

    react 代码编写原则 by Nirmalya Ghosh 由Nirmalya Ghosh 如何编写易读的React代码- 10种编码风格技巧 (How to write highly readab ...

  8. java jni编译_从源码编译Android系统的Java类库和JNI动态库的方法

    利用源码编译Android系统Java类库 1.编写Java项目和Android.mk文件 ├── Android.mk └── src └── com └── lhw └── framework └ ...

  9. Java自己文章只能自己修改_文章目录Java代码俯身指南,主要为Java开发人员提供代码复审参考,快捷有效提出修改意见。目的发现代码错误:一个人写的代码可能会有一些思想和设计盲点,多个人尽...

    文章目录 Java代码俯身指南,主要为Java开发人员提供代码复审参考,快捷有效提出修改意见. 目的发现代码错误:一个人写的代码可能会有一些思想和设计盲点,多个人尽早的发现BUG. 统一代码风格:统一 ...

最新文章

  1. Web服务端性能提升实践
  2. .ipynb文件转.py文件
  3. c#(服务器)与java(客户端)通过socket传递对象_C#(服务器)与Java(客户端)通过Socket传递对象...
  4. vector-空间增长
  5. 使用百度API进行关键点识别
  6. (81)Vivado实现约束过程
  7. 【ElasticSearch】es ResourceWatcherService 的 初始化 启动 源码解析
  8. 北京地铁和广州地铁之感想
  9. react-jwchat,一个简单的web聊天组件
  10. 日历2021年日历表|2021年日历表打印版 Excel版
  11. 如何将硬盘系统完整拷贝到另一硬盘?
  12. c语言头文件下载大全,C语言头文件大全
  13. SHA1WithRSA签名使用openssl 实现
  14. [大话设计模式C++版] 第17章 在NBA我需要翻译 —— 适配器模式
  15. OpenCV38:特征匹配
  16. Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】
  17. acwing——844. 走迷宫
  18. foxmail邮件导入Outlook 2010
  19. python实现分析你和你对象的聊天记录词云图
  20. DBSCAN密度聚类示例深入理解

热门文章

  1. jzoj4817-square【区间RMQ,二分答案】
  2. jzoj3385-黑魔法之门【并差集】
  3. 【Trie】阅读理解(luogu 3879/ybtoj Trie-4)
  4. [XSY3343] 程序锁(DP)
  5. UVALive7670 Asa's Chess Problem,上下界费用流,另类解法
  6. 动态规划训练16 [Doing Homework HDU - 1074 ]
  7. 一文带你理解Java中Lock的实现原理
  8. 简单介绍Java中Comparable和Comparator
  9. spring bean初始化及销毁你必须要掌握的回调方法。
  10. Js对象如何添加方法、查看Api