Java 8仍然需要LINQ吗? 还是比LINQ更好?
長期以來, LINQ是.NET軟件工程生態系統中發生的最好的事情之一。 通過在Visual Studio 2008中引入lambda表達式和monads ,它使C#語言比Java(當時的版本6)更先進,并且仍在討論泛型類型擦除的優缺點。 這項成就主要歸功于荷蘭計算機科學家兼染料專家Erik Meijer并獲得其認可,他現在正從事其他項目 。
Erik Meijer,Tye染料專家。 Ade Oshineye攝 。 根據CC-BY-SA許可
Java現在在哪里?
隨著即將發布的Java 8和JSR-355 ,我們仍然需要LINQ嗎? 自上個十年中期以來,已經進行了許多嘗試來將LINQ的優點帶給Java。 當時, Quaere和Lambdaj似乎是在圖書館級別(而不是語言級別)上有希望的實現。 實際上, 大量流行的Stack Overflow問題暗示了實際上有多少Java人員正在(并且仍然是!)尋找等同的東西:
- LINQ的Java等效項是什么?
- LINQ for Java工具
- 是否有類似LINQ for Java的東西?
- Linq和Entity Framework的Java等效項是什么?
有趣的是,“ LINQ”甚至已經成為EL 3.0 !
但是我們真的需要LINQ嗎?
LINQ有一個主要缺陷,該缺陷被宣傳為一項功能,但在我們看來,這將不可避免地導致“下一個大阻抗失配” 。 LINQ受SQL啟發,這根本不是一件好事。 LINQ最流行于LINQ-to-Objects ,這是查詢.NET中集合的一種好方法。 但是, Haskell或Scala的成功表明,“集合查詢”的真正功能本質傾向于使用除SELECT , WHERE , GROUP BY或HAVING之外的其他術語。 他們使用的術語包括“折疊”,“地圖”,“ flatMap”,“減少”等等。 另一方面,LINQ使用GROUP BY和“ skip”,“ take”(而不是OFFSET和FETCH )等術語的混合體。
實際上,除了良好的舊SQL 分區外部聯接, 分組集或框架窗口函數之外,沒有什么比功能真理更重要的了。 這些構造僅僅是SQL開發人員希望看到的結果的聲明。 它們不是獨立的函數,實際上包含要在任何給定上下文中執行的邏輯。 而且,窗口函數只能在SELECT和ORDER BY子句中使用, 這在以聲明方式進行思考時很明顯 ,但是如果您沒有SQL上下文,這也很奇怪。 具體來說, SELECT子句中的窗口函數會影響整個執行計劃,以及采用索引來預取正確數據的方式。
相反,真正的函數式編程對內存中集合的作用比SQL還要多。 使用SQLesque API進行集合查詢是一個狡猾的決定 ,目的是欺騙“傳統”人員采用函數式編程。 但是,使集合和SQL表查詢可以混淆的希望令人失望,因為這樣的構造不會產生所需的SQL執行計劃 。
相反,真正的函數式編程對內存中集合的作用比SQL還要多。 使用SQLesque API進行集合查詢只是錯誤的決定。 令人失望的是,收集和SQL表查詢可能會混淆在一起,因為這樣的構造將不可避免地產生可怕的SQL執行計劃 。
但是,如果我
這很簡單。 執行SQL時,有兩個基本選擇。
- “自上而下”進行操作,將大部分精力放在Java域模型上。 在這種情況下,請使用Hibernate / JPA通過Java 8 Streams API查詢和轉換Hibernate結果。
- “自下而上”進行操作,將大部分精力放在您的SQL /關系域模型上。 在這種情況下,請使用JDBC或jOOQ,然后再次使用Java 8 Streams API轉換結果。
此處對此進行了更詳細的說明: http : //www.hibernate-alternative.com
擁抱未來!
雖然.NET在Java領域已經“領先”一段時間了,但這并不是由于LINQ本身引起的。 這主要是由于引入了lambda表達式以及lambda對* ALL * API的影響。 LINQ只是如何構造此類API的一個示例,盡管LINQ贏得了大多數贊譽。
但是,我對Java 8的新Streams API以及它將如何包含Java生態系統中的某些功能編程感到更加興奮。 Informatech在一篇非常好的博客文章中說明了常見的LINQ表達式如何轉換為Java 8 Streams API表達式。
所以,不要回頭。 停止羨慕.NET開發人員。 使用Java 8,我們將不需要LINQ或任何試圖以“統一查詢”為基礎來模仿LINQ的API,這對于真正的“查詢目標阻抗不匹配”來說是一個更好的稱呼。 我們需要真正的SQL來進行關系數據庫查詢,并且需要Java 8 Streams API來進行內存中集合的功能轉換。 而已。 使用Java 8!
翻譯自: https://www.javacodegeeks.com/2013/11/does-java-8-still-need-linq-or-is-it-better-than-linq.html
總結
以上是生活随笔為你收集整理的Java 8仍然需要LINQ吗? 还是比LINQ更好?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java方法中的参数太多,第4部分:重载
- 下一篇: 煎黄金蝶鱼片(煎黄金蝶鱼片的做法)