q7goodies事例_Java 8 Friday Goodies:SQL ResultSet流

q7goodies事例

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个新的博客系列了,……

Java 8星期五

每个星期五,我们都会向您展示一些不错的教程风格的Java 8新功能,这些功能利用了lambda表达式,扩展方法和其他出色的功能。 您可以在GitHub上找到源代码 。

Java 8 Goodie:SQL ResultSet流

是的,必须再次处理SQL主题。 即使上周我们答应了关于并发性的文章 ,Java 8 lambda和与“传统” API的互操作性也是一个非常重要的方面,我们首先要讨论。

检查异常

是。 不幸的是,当我们使用Java 8的lambda表达式时,过去的那些野兽仍然困扰着我们。 在Java 8发行之前,已经有几个与此主题相关的Stack Overflow问题。

  • 标准Java 8功能接口的lambda表达式中的强制检查异常处理
  • 抛出异常的Lambda函数?
  • Lambda流,按异常进行方法过滤

让我们记住遍历文件系统时IOExceptions是如何引起问题的 。 除非您编写自己的实用程序,否则您将不得不诉诸此美:

Arrays.stream(dir.listFiles()).forEach(file -> {try {System.out.println(file.getCanonicalPath());}catch (IOException e) {throw new RuntimeException(e);}// Ouch, my fingers hurt! All this typing!
});

我们认为可以肯定地说:

Java 8和检查的异常不匹配。

一种解决方法是编写包装受检查的异常的自己的CheckedConsumer 。 这样的使用者将具有很高的可重用性,但是……您是否想到了所有其他FunctionalInterfacesjava.util.function包中有很多它们:

java.util.function中的许多类型中的一些

java.util.function中的许多类型中的一些

jOOλ–在Java 8中修复lambda

jool-logo-黑色 在编写这个Java 8博客系列时 ,我们经常遇到需要在lambda表达式中包装检查异常的需求。 当我们经常遇到问题时,极客会怎么做? 我们修复它! 并且我们创建了jOOλ(也是jOOL,jOO-Lambda) , ASL 2.0许可的 ,在其中我们几乎复制了JDK可用的每个FunctionalInterface ,以支持受检查的异常。 在上面的示例中,使用jOOλ的方法如下:

Arrays.stream(dir.listFiles()).forEach(Unchecked.consumer(file -> {// Throw all sorts of checked exceptions// here, we don't care...System.out.println(file.getCanonicalPath());})
);

上面的示例显示了如何简单地忽略检查的异常并将其作为RuntimeExceptions传递。 如果您确实想处理它们,则可以传递一个异常处理程序lambda:

Arrays.stream(dir.listFiles()).forEach(Unchecked.consumer(file -> {System.out.println(file.getCanonicalPath());},e -> {log.info("Log stuff here", e);throw new MyRuntimeException(e);}
);

现在,第二个示例似乎同样冗长,但是不用担心。 您可能会重用该异常处理程序,然后回到此状态:

Arrays.stream(dir.listFiles()).forEach(Unchecked.consumer(file -> {System.out.println(file.getCanonicalPath());},myExceptionHandler
);

jOOλ–提供JDBC ResultSet流

不幸的是,Java 8 Streams API中的大多数工作都是在正确实现可并行化流的领域中进行的。 尽管这对于实际进行并行计算的我们来说非常有用,但对于大多数其他人而言,与遗留API更好的集成会更好。 JDBC应该值得一提的是JDBC,而我们之前已经在博客上进行了介绍 。 使用jOOλ ,您现在可以直接从ResultSets甚至从PreparedStatements生成流。 准备方法如下:

Class.forName("org.h2.Driver");
try (Connection c = getConnection()) {String sql = "select schema_name, is_default " +"from information_schema.schemata " +"order by schema_name";try (PreparedStatement stmt = c.prepareStatement(sql)) {// code here}
}

现在,使用jOOλ时要做的所有事情就是流这样的PreparedStatements

SQL.stream(stmt, Unchecked.function(rs ->new SQLGoodies.Schema(rs.getString("SCHEMA_NAME"),rs.getBoolean("IS_DEFAULT"))
))
.forEach(System.out::println);

其中SQLGoodies.Schema只是普通的POJO。 一些stream()方法的签名是这些签名:

public static <T> Stream<T> stream(PreparedStatement stmt,Function<ResultSet, T> rowFunction
);public static <T> Stream<T> stream(PreparedStatement stmt,Function<ResultSet, T> rowFunction,Consumer<? super SQLException> exceptionHandler
);

其他也可用。

太棒了,不是吗?

JDBC ResultSet应该是Java 8流。

不幸的是,上面的代码没有将其纳入JDK 8,因为这将是一次最终极大地改善JDBC API的机会。 朱利安·艾森伯格(Julian Exenberger)在此进行了另一项类似的尝试来改善事物。

Java 8编写SQL的替代方法

我们还发布了使用Java 8和SQL替代jOOλ的几种方法: http : //www.jooq.org/java-8-and-sql

结论

尽管Java 8的lambda表达式很棒,但是新的Streams API却很不完整。 在实现上述内容时,我们必须实现自己的ResultSetIterator ,并将所有这些混乱情况写成将迭代器包装在Stream

StreamSupport.stream(Spliterators.spliteratorUnknownSize(new ResultSetIterator<>(supplier, rowFunction, exceptionTranslator), 0), false
);

如果只有我们能够生成有限的流 ,则不必首先编写Iterator

// Unfortunately, this method doesn't exist
Stream.generate(// Supplier, generating new POJOs() -> { rs.next(); return new SQLGoodies.Schema(rs.getString("SCHEMA_NAME"),rs.getBoolean("IS_DEFAULT"));},// Predicate, terminating the Stream() -> { !rs.isLast(); }
);

尽管jOOλ是一个可接受的中间解决方案,并且Guava家伙可能已经在研究如何修复其库,但这确实太糟糕了,因为Java 8缺少这种实用程序功能。

但是,我们在高度抱怨。 按照承诺,下周,我们将看到几个与并发相关的示例,请继续关注!

有关Java 8的更多信息

同时,请查看Eugen Paraschiv出色的Java 8资源页面

参考: Java 8 Friday Goodies:来自JACG ,SQL和JOOQ博客的JCG合作伙伴 Lukas Eder的SQL ResultSet流 。

翻译自: https://www.javacodegeeks.com/2014/03/java-8-friday-goodies-sql-resultset-streams.html

q7goodies事例

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

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

相关文章

音频光端机与电话光端机区别

在网络安防工程中&#xff0c;我们应用的比较多有电话光端机和音频光端机&#xff0c;但是在工程应用中&#xff0c;我们所用到的音频光端机是不同于电话光端机的应用。那么&#xff0c;音频光端机与电话光端机具体有哪些区别呢&#xff1f;接下来就跟随飞畅科技的小编一起来详…

[渝粤教育] 南开大学 思辨式英文写作 参考 资料

教育 -思辨式英文写作-章节资料考试资料-南开大学【】 随堂小测&#xff1a;What are the characteristics of critical essays? 1、【多选题】Which of the following types of writing are critical essays? A、A movie review B、A news report C、An editorial D、A summ…

辨别光纤收发器优劣的方法介绍

提起光纤收发器&#xff0c;不得不说它的传输稳定与传输距离。但质量不好的光纤收发器&#xff0c;要受到各种各样的考验&#xff0c;那么&#xff0c;我们该怎么区别出质量不好的光纤收发器呢&#xff1f;今天&#xff0c;飞畅科技的小编就来为大家详细介绍下辨别光纤收发器优…

一文解读光纤收发器单模和多模的区别!

光纤收发器是进行光电信号转换的设备&#xff0c;现在光纤收发器的技术越发成熟&#xff0c;应用也越来越广泛&#xff0c;所以我们在选择或者采购光纤收发器时&#xff0c;对光纤收发器做一定的了解是有好处的&#xff0c;接下来我们就来给大家详细介绍一下光纤收发器的单模和…

打造可复制爆款短视频的底层逻辑

大家都在短视频平台上做生意&#xff0c;给短视频平台带来了什么&#xff1f; 谁能满足平台需求&#xff0c;就给谁流量 谁能达成平台指标&#xff0c;就给谁流量 如何达成平台各项指标&#xff0c;做大V? 一、流量算法 曝光流量 Ya.X1 b.X2 c.X3 d.X4 e.X5 ... z.X23…

工业级光纤收发器与光端机各自的作用及区别介绍

工业通信行业的朋友应该都知道&#xff0c;光端机和光纤收发器都是一种可以进行光电转换的通信设备&#xff0c;它们之间有很多类似的功能。既然这样&#xff0c;那它们能否通用呢&#xff1f;接下来&#xff0c;就由飞畅科技的小编来给大家解释说明下光纤收发器和光端机各自的…

[渝粤教育] 厦门理工学院 机械设计 参考 资料

教育 -机械设计-章节资料考试资料-厦门理工学院【】 第三单元测验 1、【单选题】在常用的螺旋传动中&#xff0c;传动效率最高的螺纹是 A、三角形螺纹 B、梯形螺纹 C、锯齿形螺纹 D、矩形螺纹 参考资料【 】 2、【单选题】螺纹连接防松的根本目的是 A、增加螺纹连接的轴向力 B、…

光纤收发器A,B端含义解释

最近有朋友问到&#xff0c;光纤收发器型号或者收发器模块上A,B字母的含义是什么&#xff1f;今天飞畅科技的小编就来为大家介绍一下&#xff0c;收发器中A,B端字母的真正含义。一起来看看吧&#xff01; 首先,光纤收发器按光纤芯数分类有2种&#xff0c;一种是单模双纤光纤收…

光纤收发器按照网管怎么分类

光纤收发器&#xff0c;是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元&#xff0c;在很多地方也被称之为光电转换器&#xff08;Fiber Converter&#xff09;。光纤收发器按照网管分类可分为网管型以太网光纤收发器和非网管型以太网光纤收发器…

html嵌入war_WAR文件与具有嵌入式服务器的Java应用程序

html嵌入war大多数服务器端Java应用程序&#xff08;例如&#xff0c;面向Web或面向服务的&#xff09;都打算在容器中运行。 打包这些应用程序以进行分发的传统方法是将它们捆绑为WAR文件。 这只不过是具有标准目录布局的ZIP存档&#xff0c;其中包含运行时所需的所有库和应用…

飞畅科技 光纤收发器的网管型和非网管型介绍

光纤收发器按网管类型来分&#xff0c;可以分为网管型光纤收发器和非网管型光纤收发器。那么&#xff0c;光纤收发器的网管型和非网管型是什么呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细了解下吧&#xff01; 一、管理类型分类 非网管型以太网光纤收发器&#x…

[渝粤教育] 四川大学 模拟电子技术基础(Ⅰ) 参考 资料

教育 -模拟电子技术基础&#xff08;Ⅰ&#xff09;-章节资料考试资料-四川大学【】 绪论测验题 1、【单选题】当输入信号频率为fL或fH时&#xff0c;放大电路电压增益的幅值约下降为通带内水平增益的 。 A、0.5倍 B、0.7倍 C、0.9倍 D、1倍 参考资料【 】 2、【单选题】某放大…

光纤收发器连接不同端口的注意事项详解

光纤收发器在传输产品类&#xff0c;可以说是使用最多。其作用也是不言而喻。光纤收发器有多种不同的分类&#xff0c;而实际使用中大多注意的是按光纤接头不同而区分的类别&#xff1a;SC接头光纤收发器和FC以及FST接头光纤收发器。今天&#xff0c;飞畅科技的小编就告诉大家在…

光纤收发器指示灯的意义图解

光纤收发器有六个LED指示灯&#xff0c;显示收发器的工作状态。根据LED&#xff0c;可以确定收发器是否正常工作并且可能有问题&#xff0c;这有助于识别故障。那么&#xff0c;光纤收发器的每个指示灯分别代表什么意思呢&#xff1f;接下来我们就跟随飞畅科技的小编一起来详细…

四个方面快速排查工业级光纤收发器死机原因

工业级光纤收发器可以将网络传输距离大幅度提高&#xff0c;以更好地满足接入网的建设需要&#xff0c;所以工业级光纤收发器在工业通信领域使用场景很多。大家在使用时&#xff0c;可能会遇到工业级光纤收发器出现死机的现象&#xff0c;出现死机时&#xff0c;我们要怎么找出…

网管型光纤收发器功能介绍

光纤收发器可以分为网管型光纤收发器和非网管型光纤收发器&#xff0c;对于可网管的光纤收发器还可以细分为局端可网管和用户端可网管。今天&#xff0c;飞畅科技的小编来为大家详细介绍下网管型光纤收发器系统技术特点&#xff0c;一起来看看吧&#xff01; 网管光纤收发器系…

什么是光纤放大器?光放大器的原理是什么?

工业数据通信领域有很多的专业词汇&#xff0c;比如以太网、光放大器、协议转换器等。同时&#xff0c;工业通信领域也有众多的产品&#xff0c;工业交换机、工业级光纤收发器、光纤放大器、光纤延长器、协议转换器等&#xff0c;我们要搞懂这些产品&#xff0c;就先要搞懂一些…

光纤收发器测试方法和流程介绍

光纤收发器在工业传输系统组网起到重要作用&#xff0c;随着工业通信领域的高速发展&#xff0c;对光纤收发器的供求也增多。那么&#xff0c;你知道光纤收发器的测试方法和流程吗&#xff1f;接下来就由飞畅科技的小编来为大家详细介绍下光纤收发器测试方法和流程&#xff0c;…

光纤收发器的7大挑选技巧

光纤收发器&#xff0c;是一种将短距离的双绞线电信号和长距离的光信号进行互换的以太网传输媒体转换单元&#xff0c;在很多地方也被称之为光电转换器&#xff08;Fiber Converter&#xff09;。那么&#xff0c;光纤收发器的选购技巧有哪些呢&#xff1f;接下来由工业交换机厂…

光纤收发器的详细选择方法

光纤收发器做为一个区域网络连接器设备&#xff0c;其主要的任务就是怎样很好地把两方数据进行无缝连接。所以必须考虑其与周边环境相互兼容性的配合&#xff0c;及本身产品的稳定性&#xff0c;所以大家在选择一定的考虑各方面因素问题。接下来就由飞畅科技的小编来为大家详细…