日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2023/12/3 java 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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并沒有真正采用新功能。 即使有,也沒有簡單的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工作流

總結

以上是生活随笔為你收集整理的joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。