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