LINQに相当するJavaは何ですか?[閉まっている]


820

LINQに相当するJavaは何ですか?


4
それらはLINQ to SQLのようです。
SLaks、

8
これを確認してください:github.com/nicholas22/jpropel-light、実際の例:new String [] {"james"、 "john"、 "john"、 "eddie"} .where(startsWith( "j"))。toList ().distinct();
NT_

1
Java pplは引き続き複数のステートメントとforeachループを使用しますが、これはLinqによって解決できます...
om471987

1
また、完全なLINQ APIを備えたScalaの場合:github.com/nicholas22/propelS
Scooterville

4
@craastad .NETの人はほとんどJavaの世界に行き詰まっているので、私はあなたの痛みを感じます。Scalaを試してみてください-ファーストクラス関数/クロージャー、理解(LINQのクエリ構文とは異なりますが、同じ状況の多くで役立ちます)、統一型システム、型推論、一般的な型消去のためのいくつかの便利な回避策...すべて、JVMで実行され、Javaと相互運用します。さらに、パターンマッチング、オプションタイプなど、その他の機能的な
Tim Goodman

回答:


808

LINQ for Javaに勝るものはありません。

...

編集する

Java 8でStream APIが導入されました。これは、コレクションを処理する場合と同様ですが、Linqとはまったく同じではありません。

Entity Frameworkなど、探しているORMの場合は、 Hibernate

:-)


9
計画に何かありますか?言語に統合されていますか?JCP番号ですか?その他
チーソ、2009

6
非常に真実ですが、LINQを非常に優れたものにしている大きな部分は、言語とコンパイラーにどの程度深く統合されているかです
AgileJon

11
申し訳ありませんが、「非常に真実」は280Z28向けです。JCPがあるかどうかはわかりません。LINQは、JCPが動作する速度を考えれば、C#言語にいくつかの変更を加える必要がありました。
AgileJon 2009

12
これは正しくありません。参照:stackoverflow.com/questions/10879761/...
Scooterville

23
LINQは仕様であり、実装ではありません...ラムダ式はLINQの一部です。LINQをJavaに移植しようとするすべてのプロジェクトは、具体的なシナリオ(SQL、オブジェクト...)の実装ですが、LINQの主な目的を達成していません。コードに言語クエリを統合します。このため、今のところ、代替案と見なすことのできる実際の代替案も自発的な案もありません。
sesispla 2013

154

代替ソリューションCoollectionがあります。

Coolectionは新しいラムダのふりをしていませんが、このlibが役立つ古いレガシーJavaプロジェクトに囲まれています。これは、使用と拡張が非常に簡単で、コレクションに対して反復の最もよく使用されるアクションのみをカバーしています。

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

7
列名の文字列。これは、コンパイラーとIDEのオートコンプリートがタイプミスに対応せず、リファクタリングが難しいことを意味します。それを変える計画はありますか?
Ekevoo 2014年

2
こんにちは、Ekevoo。かっこいいと思いますので、いつかやってみました。しかし、現時点では、Java 8ではCoollectionは廃止されたlibです。おそらくそれは最も古いプロジェクトに役立つでしょう...どう思いますか?
19WAS85 14

1
@WagnerAndrade最後のコミットは5〜6年前です。機能の大部分がJava 8に置き換えられたと思いますか?また、とてもクールな名前:)
Abdul

145

ラムダは、JSR-335の形式でJava 8内で利用できるようになりました-JavaTMプログラミング言語のラムダ式

更新:プロジェクトラムダを含むJDK8がリリースされました。動作中Java 8のコピーを入手する価値があります現在でもMEAP。

ラムダがJDK8内でどのように実装されているかを理解するために、ラムダに関するBrian Goetzの記事を読んでください。また、ストリーム、内部反復、ショートサーキット、およびコンストラクターのリファレンスについても理解しています。また、他の例については、上記のJSRを確認してください。 。

The Power of the Arrowと呼ばれるJDK8でラムダを使用する利点のいくつかについてブログを書きました。また、NetBeans 8は、コンストラクトをJDK8に変換するための優れたサポートがあり、NetBeansでのJDK 8への移行についてもブログに書いています。


ラムダもJava 7に組み込まれる予定はありませんか?何が起きたのですか?
BlueRaja-Danny Pflughoeft、2011年

7
OracleはSun(ほほの舌)を買った。Java 7は時間がかかりすぎた(5年)ため、ラムダが候補リストに載りませんでした。これは大衆にかなりがっかりしました。とは言っても、オラクルは順調に進んでいるように見え、来年の10月8日にJavaの予定があると思います。
ブレットライアン

1
ラムダの状態が再び更新され、ストリーム、内部反復、短絡、およびコンストラクター参照をカバーするようになったことに注意してください。新しいドキュメントを読むことをお勧めします。
Brett Ryan、

6
ラムダ式はLINQの一部です。
sesispla 2013

4
@ NeWNeO、C#でクエリ言語を参照している場合、そうです、これはJavaにはありませんが、私の経験では、ほとんどの熟練したC#開発者はクエリ言語よりもラムダ構文を好みます。ただし、たとえばLINQ-to-Entitiesを参照している場合は、Javaのラムダを使用すると、これ以上のことが可能になります。これを可能にするため、ディフェンダーメソッドなど、Java 8にはさらに多くの機能が追加されます
ブレット・ライアン

119

lambdajライブラリーを使用することにより、コレクション(およびその他)の項目をより読みやすい方法で選択できます

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

マジックストリングを使用しないため、Quaereライブラリよりもいくつかの利点があります。完全にタイプセーフであり、私の意見では、より読みやすいDSLを提供します。


6
これはいいですが、クエリを作成して再度実行するのとはほど遠いです
。sql

Androidプロジェクトのカスタムクラスでlambdaj selectを使用すると、なぜjava.lang.ExceptionInInitializerErrorが発生するのですか?
topwik 2012

1
+1これは、SQL / XMLを気にせず、コレクションへのアクセスを簡単にしたいという私たちにとって本当に良いことです。
ashes999 2014年

101

javaccを使用しない限り、LINQに相当するものは見つかりません。独自の同等のものを作成を。

誰かがそうするための実行可能な方法を見つけるその日まで、いくつかの良い選択肢があります。


github.com/TrigerSoft/jaqueはこのようにして、式ツリーを作成できます。Java 8 Lambdasと組み合わせると、あらゆるLINQ容量を.Netと同じように実装できます。
Konstantin Triger、2014年

比較のためにこの回答を参照してください。stackoverflow.com/questions/25989449/...
コンスタンチンTriger

49

LINQ to Objects -JAVA 8は、値のストリームに対する関数スタイルの操作のサポートを追加するStream APIを追加しました:

パッケージjava.util.stream

Java 8の説明:Javaコレクションへのラムダの適用

LINQ to SQL / NHibernate / etc。(データベースクエリ) -1つのオプションは、新しいJAVA 8機能も使用し、2014年2月26日にGithubでリリースされたJINQを使用することです:https : //github.com/my2iu/Jinq

Jinqは、Javaでデータベースクエリを作成する簡単で自然な方法を開発者に提供します。コレクションに格納されている通常のJavaオブジェクトのようにデータベースデータを扱うことができます。それらを反復処理し、通常のJavaコマンドを使用してフィルタリングできます。すべてのコードは、最適化されたデータベースクエリに自動的に変換されます。最後に、LINQスタイルのクエリをJavaで使用できます。

JINQプロジェクトサイト:http ://www.jinq.org/


Stream APIがLINQに最も近いにもかかわらず、読者があなたの回答に注意を払わなかった理由がわかりません!
Rafid 2014

3
Streams APIは、LINQと比較して悪い冗談です。
AndreiRînea17年

1
失礼なことを言っているのではありません。ストリームAPIで頭を打った後、同等のLINQを探していました。私はそれが本当の同等物ではないことを言いたかっただけです、それだけです。
AndreiRînea2017

1
@AndreiRîneaLINQプロバイダー(LINQ to XML、LINQ to JSON、LINQ to NHibernateなど)の同等の機能を探していますか?
はRazvanフラウィウスパンダ

2
必要なのは、コレクションをグループ化して最大化するための手段です。
AndreiRînea2017

29

quaereというプロジェクトがありますます。

これは、コレクションをクエリする機能を追加するJavaフレームワークです。

注:著者によると、プロジェクトはもう維持されていません。


2
QuaereはLINQが提供するものの一部を提供しているように見えますが、問題は「同等のもの」
AgileJon

6
だから、直接同等ではないとしても、それはLINQ のようものですか?それは少なくとも役立つと
思い

3
@AgileJon:彼が本当に同等のものを意味するなら、彼は尋ねなかっただろう。彼はタイプfrom x in xs select xして答えを見つけることができたでしょう(いいえ)。
kizzx2

18

JavaにはLINQに相当するものが多数あります。比較については、こちらを参照してください。

タイプセーフなQuaere / LINQスタイルフレームワークの場合は、Querydslの使用を検討してください。Querydslは、JPA / Hibernate、JDO、SQL、およびJavaコレクションをサポートしています。

私はQuerydslのメンテナーなので、この答えは偏っています。


6
「類似のフレームワーク」リンクは機能していません。同等のページはまだありますか?
Lukas Eder、2012

QueryDSL本はいつ入手できますか?または手頃な価格のトレーニングオプションですか?サポートリンク404。
kervin 2014年

16

scalaを使用できます。これは構文が似ており、おそらくlinqよりも強力です。


1
特に Scalaの「理解のため」。
ニコニコ


9

Java 8がラムダをサポートするようになったので、LINQによく似たJava APIを作成することができます。

Jinqは、Java用のこれらの新しいLINQスタイルライブラリの1つです。

私はこのライブラリの開発者です。これは、バイトコード分析を使用してJavaをデータベースクエリに変換する5年間の研究に基づいています。C#のD-LINQがEntity Frameworkの上にあるクエリレイヤーと同様に、JinqはJPAまたはjOOQの上にあるクエリレイヤーとして機能できます。集計、グループ、サブクエリをサポートしています。Erik Meijer(LINQの作成者)でさえ、Jinq認めています


8

SBQL4Jを参照。これは、Javaと統合されたタイプセーフな強力なクエリ言語です。複雑で多重にネストされたクエリを書くことができます。演算子はたくさんありますが、Javaメソッドはクエリ内でコンストラクタとして呼び出すことができます。クエリは純粋なJavaコードに変換されるため(実行時にリフレクションはありません)、実行は非常に高速です。

編集:まあ、これまでのところSBQL4Jは、LINQと同様のクエリ機能を提供するJava言語への唯一の拡張です。QuaereやJaQueのようないくつかの興味深いプロジェクトがありますが、これらは単なるAPIであり、コンパイル時に強力な型安全性を備えた構文/セマンティクスの拡張ではありません。


6
プロジェクトでのあなたの役割について言及したいと思うかもしれません。
するThorbjörnRavnアンデルセン


7

私はグーグルからグアバ図書館を試しました。それは持っている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();
        }
    });

Javaの拡張ライブラリのようです。確かにLINQほど簡潔ではありませんが、面白そうです。


7

https://code.google.com/p/joquery/

さまざまな可能性をサポートし、

与えられたコレクション、

Collection<Dto> testList = new ArrayList<>();

タイプの、

class Dto
{
    private int id;
    private String text;

    public int getId()
    {
        return id;
    }

    public int getText()
    {
        return text;
    }
}

フィルタ

Java 7

Filter<Dto> query = CQ.<Dto>filter(testList)
    .where()
    .property("id").eq().value(1);
Collection<Dto> filtered = query.list();

Java 8

Filter<Dto> query = CQ.<Dto>filter(testList)
    .where()
    .property(Dto::getId)
    .eq().value(1);
Collection<Dto> filtered = query.list();

また、

Filter<Dto> query = CQ.<Dto>filter()
        .from(testList)
        .where()
        .property(Dto::getId).between().value(1).value(2)
        .and()
        .property(Dto::grtText).in().value(new string[]{"a","b"});

並べ替え(Java 7でも利用可能)

Filter<Dto> query = CQ.<Dto>filter(testList)
        .orderBy()
        .property(Dto::getId)
        .property(Dto::getName)
    Collection<Dto> sorted = query.list();

グループ化(Java 7でも利用可能)

GroupQuery<Integer,Dto> query = CQ.<Dto,Dto>query(testList)
        .group()
        .groupBy(Dto::getId)
    Collection<Grouping<Integer,Dto>> grouped = query.list();

結合(Java 7でも使用可能)

与えられた、

class LeftDto
{
    private int id;
    private String text;

    public int getId()
    {
        return id;
    }

    public int getText()
    {
        return text;
    }
}

class RightDto
{
    private int id;
    private int leftId;
    private String text;

    public int getId()
    {
        return id;
    }

    public int getLeftId()
        {
            return leftId;
        }

    public int getText()
    {
        return text;
    }
}

class JoinedDto
{
    private int leftId;
    private int rightId;
    private String text;

    public JoinedDto(int leftId,int rightId,String text)
    {
        this.leftId = leftId;
        this.rightId = rightId;
        this.text = text;
    }

    public int getLeftId()
    {
        return leftId;
    }

    public int getRightId()
        {
            return rightId;
        }

    public int getText()
    {
        return text;
    }
}

Collection<LeftDto> leftList = new ArrayList<>();

Collection<RightDto> rightList = new ArrayList<>();

次のように参加できます

Collection<JoinedDto> results = CQ.<LeftDto, LeftDto>query().from(leftList)
                .<RightDto, JoinedDto>innerJoin(CQ.<RightDto, RightDto>query().from(rightList))
                .on(LeftFyo::getId, RightDto::getLeftId)
                .transformDirect(selection ->  new JoinedDto(selection.getLeft().getText()
                                                     , selection.getLeft().getId()
                                                     , selection.getRight().getId())
                                 )
                .list();

Filter<Dto> query = CQ.<Dto>filter()
    .from(testList)
    .where()
    .exec(s -> s.getId() + 1).eq().value(2);

5

私のライブラリCollectionsQueryを試すことができます。オブジェクトのコレクションに対してLINQのようなクエリを実行できます。LINQと同様に、述語を渡す必要があります。java6 / 7を使用している場合は、インターフェースで古い構文を使用する必要があります。

List<String> names = Queryable.from(people)
                                    .filter(new Predicate<Person>() {
                                                public boolean filter(Person p) {
                                                    return p.age>20;
                                                }
                                            })
                                    .map   (new Converter<Person,String>() {
                                                public Integer convert(Person p) {
                                                    return p.name;
                                                }
                                            })
                                    .toList();

Java8、またはRetroLambdaを備えた古いJavaとGradle プラグインで使用することもできます。そうすると、新しい豪華な構文になります。

List<String> names = Queryable.from(people)
                                    .filter(p->p.age>20)
                                    .map   (p->p.name)
                                    .toList();

DBクエリを実行する必要がある場合は、上記のようにJINQで確認できますが、シリアル化されたラムダを使用してRetroLambdaでバックポートすることはできません。



4

もう1つの選択肢を追加するだけです。Java6には、javax.persistence.criteriaパッケージを使用したタイプセーフなデータベースクエリのソリューションがあります。

これは実際にはLINQではないと言う必要がありますが、LINQでは任意のIEnumerableをクエリできます。


うん、それはJPA APIです。LINQには程遠いが、何もないよりはましだ。そして、それはHibernate Criteria APIに大まかに基づいていると言えます。参照:docs.jboss.org/hibernate/core/3.6/reference/en-US/html/...
Hendy Irawan

4

これに使用できる非常に優れたライブラリがあります。

ここにあります:https : //github.com/nicholas22/jpropel-light

ただし、ラムダはJava 8まで利用できません。そのため、ラムダを使用することは少し異なり、自然に感じられません。


4

ここで誰もが話しているLinqはLinqToObjectsにすぎないようです。これは、Javaですでに今日実現できる機能だけを提供していると思いますが、構文は本当に醜いものです。

.NetのLinqの真の力として私が見ているのは、ラムダ式はデリゲートまたは式のいずれかを必要とするコンテキストで使用でき、適切な形式にコンパイルされるということです。これにより、LinqToSql(またはLinqToObjects以外の何か)が機能し、LinqToObjectsと同じ構文を使用できるようになります。

上記のプロジェクトはすべて、LinqToObjectsの機能のみを提供しているようです。これにより、LinqToSqlタイプの機能がJavaの地平線に近づいていないことがわかります。


4

基本的な機能コレクションについては、Java 8に組み込まれており、主要な非Java JVM言語のほとんど(Scala、Clojureなど)に組み込まれており、以前のバージョンのJavaのライブラリを追加できます。

SQLデータベースへの完全な言語統合アクセスのために、Scala(JVMで実行)にはSlickがあります。


3

LINQ(LINQ to Objects)の場合、Java 8には同等の機能があります。ProjectLambdaを参照してください。

これは、列挙の持っているオブジェクトの拡張へのLINQのように詰め込むを。しかし、ExpressionやExpressionTree などのより複雑なLINQの場合(LINQ to SQLやその他のLINQプロバイダーが最適化されたリアルなものを提供したい場合は、これらが必要です)、まだ同等のものはありませんが、将来的には見られるでしょう:)

しかし、将来的にはJavaでの宣言型クエリのようなものはないと思います。


2

Javaにはそのような機能はありません。他のAPIを使用すると、この機能を利用できます。同様に、名前とIDを含む動物オブジェクトがあるとします。動物オブジェクトを持つリストオブジェクトがあります。次に、リストオブジェクトから「o」を含むすべての動物の名前を取得する場合は、次のクエリを書くことができます

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

上記のQueryステートメントは、名前に「o」のアルファベットを含む動物のリストを表示します。詳細については、次のブログをご覧ください。 http://javaworldwide.blogspot.in/2012/09/linq-in-java.html


2

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);
}

1

JaQuは、Javaに相当するLINQです。H2データベース用に開発されましたが、JDBCを使用しているため、どのデータベースでも機能するはずです。


1

多分あなたが望んでいる答えではないかもしれませんが、あなたのコードの一部がコレクション(検索、ソート、フィルタリング、変換、分析)に重い作業を必要とする場合、ClojureまたはScalaでいくつかのクラスを書くことを考慮するかもしれませんください。

彼らの機能的な性質のため、コレクションでの作業は彼らが得意とするものです。私はScalaの経験はあまりありませんが、Clojureを使用すると、おそらくより強力なLinqをすぐに見つけることができ、コンパイルすると、生成するクラスは残りのコードベースとシームレスに統合されます。


1
GroovyやjRubyも、より機能的な性質を持つため、実行可能な候補になります。
cdeszaq 2011

1

匿名ユーザーが別のユーザーDitingに言及しました

Ditingはクラスライブラリであり、.NETのLinqのように、チェーン可能なメソッドと匿名インターフェイスを通じてコレクションにクエリ機能を提供します。静的メソッドを使用している他のほとんどのコレクションライブラリとは異なり、コレクション全体を反復処理する必要があります。Ditingは、コレクションまたは配列にクエリを実装するための遅延チェーン可能なメソッドを含むコアEnumerableクラスを提供します。

サポートされているメソッド:any、cast、contact、contains、count、distinct、elementAt、except、first、firstOrDefault、groupBy、interset、join、last、lastOrDefault、ofType、orderBy、orderByDescending、reverse、select、selectMany、single、singleOrDefault、skip 、skipWhile、take、takeWhile、toArray、toArrayList、union、where


1

Scala.Now私はそれを読んで、linqのようにそれを見つけましたが、よりシンプルで読みにくいです。しかし、ScalaはLinuxで実行できますか?csharpにはモノが必要です。


1
Scalaを実行するにはJavaランタイムが必要です。インストールするコンポーネントによっては、Linuxのベアインストールでも動作するとは限りません。
2014

@Rup GNU / Linuxには完全に準拠した JREがあり、 Monoは完全に準拠した .NET実装ではありません
表示名

@Sargeそれは私のポイントではありませんでしたが、MonoはLINQを十分に実行していますか?さらに、Microsoft独自の.Net Core for Linuxが登場しました
Rup

(GNU /)LinuxはWindows以外のプラットフォームだけではなく、JREはさまざまなプラットフォームに対応しています。Monoはすべてを完全に実装しているわけではありません。たとえば、WPFはありません。
表示名

0

プログラミング言語Pizza(Java拡張機能)がありましたので、それを見てください。-「流れるようなインターフェイス」の概念を使用して、宣言的な方法でデータをクエリします。これは、原則として、クエリ式を使用しないLINQ(http://en.wikipedia.org/wiki/Pizza_programming_language)と同じです。しかし、悲しいかな、それは追求されませんでしたが、LINQのようなものをJavaに取り込む1つの方法でした。


1
確かに「ピザ」という名前ではなく、それは追求されました。PizzaのジェネリックはGJにマージされ、それがJava 1.3リファレンスコンパイラになりました(ジェネリックは1.5までフラグの後ろに隠されていました)。それまでの間、残りのアイデアといくつかの追加機能がScalaになりました。
Kevin Wright

その情報をありがとう、もちろんScalaはここで良い点です。しかし、これらの機能はJava言語に統合されていません。Scala言語を使用して素敵なクエリコードを実装し、Javaからの結果のバイナリを使用できます。
ニコ

またでONGL参照commons.apache.org/proper/commons-ognl使用中であり、まだ維持されています、。
ニコ


0

このライブラリを試すことができます: https //code.google.com/p/qood/

使用する理由は次のとおりです。

  1. 軽量:9つのパブリックインターフェイス/クラスのみを学習します。
  2. SQLのようなクエリ:group-by、order-by、left join、formulaなどをサポートします。
  3. ビッグデータの場合:ヒープメモリの代わりにファイル(QFS)を使用します。
  4. オブジェクトリレーショナルインピーダンスミスマッチの解決を試みます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.