什麼是LINQ的Java等價物?




linq stream (24)

什麼是Java相當於LINQ?


有一個替代解決方案, Coollection

Coolection並沒有假裝成新的lambda,但是我們被這個lib將幫助的舊的遺留Java項目所包圍。 它的使用和擴展非常簡單,只覆蓋對集合進行迭代的最常用操作,如下所示:

from(people).where("name", eq("Arthur")).first();
from(people).where("age", lessThan(20)).all();
from(people).where("name", not(contains("Francine"))).all();

就像2014年一樣,我終於可以說LINQ終於在java 8中有了。所以不需要再找到LINQ的替代品了。


Java有很多LINQ等價物,請參閱here作為比較。

對於類型安全的Quaere / LINQ樣式框架,請考慮使用Querydsl 。 Querydsl支持JPA / Hibernate,JDO,SQL和Java Collections。

我是Querydsl的維護者,所以這個答案是有偏見的。


有一個叫做quaere的項目。

這是一個Java框架,增加了查詢集合的能力。

注:根據作者,該項目不再被維護。


對於LINQ(LINQ to Objects),Java 8將具有相同的功能,請參閱Project Lambda

它具有Enumerable的LINQ to Objects擴展,比如stuffs 。 但是對於像Expression和ExpressionTree這樣更複雜的LINQ的東西(如果他們想要提供優化和真實的東西,LINQ to SQL和其他LINQ提供者需要這些東西),但沒有任何等價物,但也許我們會在未來看到:)

但我不認為將來會有類似Java的聲明性查詢之類的東西。


只需添加另一個選擇:Java 6確實使用javax.persistence.criteria包提供了用於類型安全的數據庫查詢的解決方案。

雖然我必須說這不是真正的LINQ,因為使用LINQ你可以查詢任何IEnumerable。


Lambda現在在Java 8中以JSR-335的形式提供- 用於JavaTM編程語言的Lambda表達式

更新JDK8現已發布 ,其中包含項目lambda。 在Action當前仍然是MEAP中,抓住Java 8的一個副本是值得的。

閱讀Brian Goetz有關lambdas的文章,了解如何在JDK8中實現lambdas,同時獲得對流,內部迭代,短路和構造函數引用的理解。另請參閱上面的JSR以獲取更多示例。

我已經寫了一篇關於在JDK8中使用lambdas的稱為“箭頭的力量 ”的優點的博客,同時NetBeans 8也很好地支持將構造轉換為JDK8,我也在博客中介紹瞭如何使用NetBeans遷移到JDK 8


對於Java來說,並不是真正的“Linq to SQL”。 但接近它。 Querydsl


也許不是你希望的答案,但是如果你的某些代碼需要在集合上進行繁重的工作(搜索,排序,過濾,轉換,分析),你可以考慮在ClojureScala編寫一些類。

由於它們的功能性,與收藏品合作是他們最擅長的。 我對Scala並沒有太多經驗,但在Clojure中,您可能會在您的指尖找到更強大的Linq,一旦編譯完成,您生成的類將與代碼庫的其餘部分無縫整合。


你可以使用scala,它的語法類似,實際上可能比linq更強大。


現在Java 8支持lambdas,可以創建非常類似於LINQ的Java API。

http://www.jinq.org/是這些新的LINQ風格的Java庫之一。

我是這個圖書館的開發者。 它基於使用字節碼分析將Java轉換為數據庫查詢的五年研究。 類似於C#的D-LINQ是位於實體框架之上的查詢層,Jinq能夠充當位於JPA或jOOQ之上的查詢層。 它支持聚合,組和子查詢。 即使是Erik Meijer(LINQ的創造者)也承認Jinq


對於基本的功能集合,Java 8已經內置了它,大多數主要的非Java JVM語言都內置了它(Scala,Clojure等),並且您可以為早期的Java版本添加庫。

為了實現對SQL數據庫的完全語言集成訪問,Scala(運行在JVM上)具有Slick


請參閱SBQL4J 。 它是與Java集成的類型安全的強大查詢語言。 允許編寫複雜和多重嵌套的查詢。 有很多運算符,可以在查詢內部調用Java方法,從而構造函數。 查詢被轉換為純Java代碼(運行時沒有反射),因此執行速度非常快。

編輯:那麼,到目前為止SBQL4J它是Java語言的唯一擴展,它提供類似於LINQ的查詢功能。 有一些像Quaere和JaQue這樣有趣的項目,但它們只是API的,而不是語法/語義擴展,在編譯時具有強大的類型安全性。


java中沒有這樣的功能。 通過使用其他API,您將獲得此功能。 就像我們有一個動物對象包含名稱和ID。 我們有列表對像有動物對象。 現在,如果我們想從列表對像中獲取包含'o'的所有動物名稱。 我們可以寫下面的查詢

from(animals).where("getName", contains("o")).all();

以上查詢語句將列出名稱中包含'o'字母的動物。 更多信息請通過以下博客。 http://javaworldwide.blogspot.in/2012/09/linq-in-java.html


JaQu是Java的LINQ等價物。 雖然它是為H2數據庫開發的,但它應該適用於任何數據庫,因為它使用JDBC。


您可以使用lambdaj庫以更易讀的方式選擇集合中的項目(以及更多)

https://code.google.com/archive/p/lambdaj/

它比Quaere庫有一些優點,因為它不使用任何魔術字符串,它是完全類型安全的,並且在我看來它提供了更可讀的DSL。


JaQue AC#的解決方案是JaQue ,它為Java JaQue提供表達式樹。 最重要的是可以實現特定於領域的LINQ提供程序。



有編程語言比薩(一個Java擴展),你應該看看它。 - 它使用“流暢接口”的概念以聲明方式查詢數據,並且原則上與無查詢表達式的LINQ相同(http://en.wikipedia.org/wiki/Pizza_programming_language)。 但是,它並沒有被追求,但它可能是將LINQ類似於Java的一種方法。


一位匿名用戶提到另一位, Diting

Diting是一個類庫,通過可鍊式方法和.NET中的Linq等匿名接口為集合提供查詢功能。 與大多數其他集合庫不同,那些使用靜態方法需要迭代整個集合,Diting提供了一個核心Enumerable類,其中包含可實現對集合或數組的查詢的可鍊式方法。

支持的方法:any,cast,contact,contains,count,distinct,elementAt,first,firstOrDefault,groupBy,interset,join,last,lastOrDefault,ofType,orderBy,orderByDescending,reverse,select,selectMany,single,singleOrDefault,skip ,skipWhile,take,takeWhile,toArray,toArrayList,union,where


這聽起來像大家在這裡談論的Linq只是LinqToObjects。 我相信這只能提供現在已經可以在Java中完成的功能,但卻帶有非常難看的語法。

我在.Net中看到Linq的實際功能是,lambda表達式可用於需要Delegate或Expression的上下文,然後將其編譯為適當的形式。 這允許像LinqToSql(或除LinqToObjects之外的任何其他語言)的工作,並允許它們具有與LinqToObjects相同的語法。

看起來上面提到的所有項目都只提供LinqToObjects的功能。 這讓我擔心LinqToSql類型的功能不在Java的地平線上。


沒有什麼像Java的LINQ。



我嘗試了谷歌的guava-libraries 。 它有一個FluentIterable ,我認為它接近於LINQ。 另請參閱FunctionalExplained

List<String> parts = new ArrayList<String>();  // add parts to the collection.    
FluentIterable<Integer> partsStartingA = 
    FluentIterable.from(parts).filter(new Predicate<String>() {
        @Override
        public boolean apply(final String input) {
            return input.startsWith("a");
        }
    }).transform(new Function<String, Integer>() {
        @Override
        public Integer apply(final String input) {
            return input.length();
        }
    });

似乎是一個廣泛的Ja​​va庫。 當然不像LINQ那麼簡潔,但看起來很有趣。





linq