web-dev-qa-db-ja.com

LINQと同等のJavaとは何ですか?

LINQと同等のJavaとは何ですか?

782
Ahmed

LINQ for Javaのようなものは何もありません。

...

編集

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

それがEntity Frameworkのように、あなたが探しているORMであるなら、あなたは Hibernate を試すことができます

:-)

791
AgileJon

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();
153
19WAS85

ラムダは現在使用可能JSR-335 - JavaTMプログラミング言語用のラムダ式 の形でJava 8内で

_ update _ JDK 8は現在リリースされています プロジェクトのラムダを含みます。現在のところまだMEAPである Java 8 in Action のコピーを入手する価値があります。

ラムダがJDK 8でどのように実装されているかについての適切な理解のためにラムダに関連する Brian Goetz の記事を読みながら、ストリーム、内部反復、短絡およびコンストラクタの参照について理解してください。その他の例については、JSRを参照してください。

私は The Power of the Arrow と呼ばれるJDK 8でラムダを使用する利点のいくつかについてブログを書きました。また、 NetBeans 8 はJDK 8への変換をサポートしています。 NetBeansによるJDK 8への移行 についてのブログも投稿しました。

144
Brett Ryan

あなたはlambdajライブラリを使うことによってもっと読みやすい方法でコレクションの中の(そしてもっと多くの)アイテムを選択することができます。

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

これはQuaereライブラリに比べていくつかの利点があります。マジックストリングを一切使用せず、完全にタイプセーフであり、私の考えではより読みやすいDSLを提供しているからです。

119
Mario Fusco

あなたがあなた自身の同等物を作成するために javacc を使わない限り、あなたはLINQの同等物を見つけることができません。

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

100
Lukas Eder

オブジェクトへのLINQ - Java 8では、値のストリームに対する機能的な操作のサポートを追加するStream APIが追加されました。

パッケージJava.util.stream

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

SQL/NHibernate/etcへのLINQ。 (データベースクエリ) - JINQを使用するという選択肢もあります。JINQは、Java 8の新機能を使用し、2014年2月26日にGithubでリリースされました。 https://github.com/my2iu/Jinq

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

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

49

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

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

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

29
Sadegh

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

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

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

17

あなたはscalaを使うことができます、それは構文において似ています、そしてそれは実際にはおそらくlinqより強力です。

15
Erion

2014年の時点で、私はついにLINQがJava 8に登場したと言うことができます。LINQの代替を見つける必要はもうありません。

10
Abhinab Kanrar

C#のような解決策は JaQue で、これはJava LambdasにExpression Treeを提供します。これに加えて、ドメイン固有のLINQプロバイダーを実装することができます。

9

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

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

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

9
Ming-Yee Iu

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

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

8
Emil Wcisło

Googleから guava-libraries を試してみました。それは私がLINQに近いと思うFluentIterableを持っています。 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
Madhan Ganesh

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

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

LINQを使用すると、IEnumerableを照会できるので、これは実際にはLINQではないと言う必要があります。

4
metator

これに使える、とても良いライブラリがあります。

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

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

4
Moox

私のライブラリ 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();

また、Java 8で、または RetroLambda および gradle plugin を使用して古いJavaで使用することもできます。そうすると、新しい派手な構文になります。

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

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

4
Bogdan Mart

みんながここで話しているのは、LinqToObjectだけです。これは、今日Javaですでに達成されている機能を提供しているだけで、本当に醜い構文を使用していると私は信じています。

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

上記のすべてのプロジェクトがLinqToObjectsの機能を提供しているだけのようです。そのため、LinqToSqlタイプの機能はJavaには向いていません。

4
MarkPflug

基本的な機能コレクションとしては、Java 8が組み込まれており、Java以外の主要なJVM言語のほとんど(Scala、Clojureなど)が組み込まれており、以前のJavaバージョン用のlibを追加することができます。

SQLデータベースへの全言語統合アクセスのために、Scala(JVM上で動作)は Slick を持っています。

4
clay

LINQ(LINQ to Objects)に関しては、Java 8は同等のものを持つでしょう。 Project Lambda を見てください。

それはEnumerableの LINQ to Objects拡張 like stuffs を持っています。しかし、 Expression やExpressionTree(最適化された本物のものを提供したいのであれば、これらはLINQ to SQLや他のLINQプロバイダに必要です)のようなもっと複雑なLINQのものに関して:)

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

3
Ebrahim Byagowi

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

Javaにはそのような機能はありません。他のAPIを使用することによって、あなたはこの機能を手に入れるでしょう。名前とIDを含む動物オブジェクトがあるとします。動物オブジェクトを持つリストオブジェクトがあります。リストオブジェクトから 'o'を含むすべての動物の名前を取得したいのであれば。次のようなクエリを書くことができます

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

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

2
Vishnu

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

それらの機能的な性質のために、コレクションを扱うことは彼らが最も得意とするところです。私はScalaについてはあまり経験がありませんが、Clojureを使えば、もっと強力なLinqをすぐに見つけることができ、コンパイルすると、生成したクラスは他のコードベースとシームレスに統合されます。

1
pistacchio

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

1
Basil Musa

Scala.Now私はそれを読んで、そしてlinqのようにそれを見つけました、しかしもっと単純でそしてもっと読めない。しかし、scalaはLinuxでも動作します。 csharpはモノが必要です。

1
GeminiYellow

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

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

サポートされているメソッド:any、cast、contact、contains、count、distinct、elementAt。 、skipWhile、take、takeWhile、toArray、toArrayList、共用体、ここで

1
Rup

HQL (Hibernate Query Language).NetLinqと非常によく似ています

0
Khalil10

Javaの"Linq to SQL"相当物ではありません。しかしそれに近い何か。 クエリDSL

0
KyelJmD

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

これを使用するいくつかの理由はここにあります:

  1. 軽量:学ぶための唯一の9パブリックインターフェイス/クラス。
  2. sQLのようなクエリ:group-by、order-by、left join、formulaなどをサポートします。
  3. ビッグデータの場合:ヒープメモリの代わりにファイル(QFS)を使用します。
  4. オブジェクトリレーショナルインピーダンスのミスマッチを解決しよう
0
schsu01

恥知らずなセルフプラグ:あなたはいつも https://github.com/amoerie/jstreams を使うことができます

Java 6以上で動作します。Android開発に最適です。

Scalaの演算子、lodash、C#LINQなどによく似ています。

0
Moeri
0
It's me

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

0
Nico

Java Functional Utilsを使ってC#の101 LINQの例を変換できます これはAndroid上のJava 1.7と互換性があります。

0
mythz