不要错过使用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单行代码的机会的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux分割文件命令(linux分割)
- 下一篇: ddos压力在线测试平台(ddos压力在