java - linq stream




什麼是LINQ的Java等價物? (20)

什麼是Java相當於LINQ?


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


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

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

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


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

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

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


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


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


LINQ to Objects - JAVA 8添加了Stream API,該API增加了對值流的函數式操作的支持:

包java.util.stream

Java 8解釋:將Lambdas應用於Java集合

LINQ to SQL / NHibernate /等。 (數據庫查詢) - 一種選擇是使用也使用新的JAVA 8功能的JINQ,並於2014年2月26日發佈在Github上: https://github.com/my2iu/Jinqhttps://github.com/my2iu/Jinq

Jinq為開發人員提供了一種用Java編寫數據庫查詢的簡單自然的方法。 您可以像存儲在集合中的普通Java對像一樣對待數據庫數據。 您可以遍歷它們並使用普通的Java命令對其進行過濾,並且您的所有代碼都將自動轉換為優化的數據庫查詢。 最後,LINQ風格的查詢可用於Java!

JINQ項目網站: http://www.jinq.org/ : http://www.jinq.org/


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

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


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


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

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


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


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

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


就像2014年一樣,我終於可以說LINQ終於在java 8中有了。所以不需要再找到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那麼簡潔,但看起來很有趣。


有一個叫做quaere的項目。

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

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



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


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

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

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


看看tiny-q 。 (請注意,您目前無法下載它。)

以下是一個適用於上述鏈接的示例:

首先,我們需要收集一些數據,比如一組字符串

String[] strings = { "bla", "mla", "bura", "bala", "mura", "buma" };

現在我們只想選擇以“b”開頭的字符串:

Query<String> stringsStartingWithB = new Query<String>(strings).where(
    new Query.Func<String, Boolean>(){
        public Boolean run(String in) {
            return in.startsWith("b");
        }
    }
);

沒有實際的數據被移動拷貝或者類似的東西,只要你開始迭代,它就會得到處理:

for(String string : stringsStartingWithB ) {
    System.out.println(string);
}

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

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

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






linq