web-dev-qa-db-ja.com

最高のJava Linqと同等のものは何ですか?

Javaには、Linqの機能の提供に近いライブラリはありますか?

17
rdasxy

完全なLINQクエリ構文を取得するには、新しいキーワードと構文構造をサポートする言語仕様とコンパイラを更新する必要があります。これは、ここでのほとんどの読者をはるかに超えています。

Linqのようなメソッドチェーン構文をJavaで表示し、C#のように機能させるには、2つのものが必要ですJavaはサポートしていません。拡張メソッド(インスタンスメソッドのようにインスタンスに適用できる静的メソッド)、およびラムダ式(匿名デリゲート)。ただし、これら2つは既存のJava構成体で偽装できます。あなたが少し余分なコーディングの冗長性を負いたいと思っているなら。Javaについて特に驚くべきことの1つは、匿名のインターフェース実装を作成する能力です;単一の純粋な関数を持つインターフェースに適用され、必要な各メソッドシグネチャのインターフェイスがある場合は、基本的にシンプルな匿名デリゲートを使用できます。

したがって、メソッドチェーンとしてのLinqのIEnumerable(Iterable for the Javaheads)側は、Javaで近似できるはずです。基本的に、モナドを制御する流暢なインターフェースとして実装します。 Iterableを実装するLinqIterableのようなクラスが必要です。

  • iterable入力をLinqIterableインスタンスに変換できます
  • には、フィルタリング、グループ化、連結、交差、順序付けなどの基本的なリスト処理のためのメソッドがあり、単一関数のインターフェースを受け入れて新しいLinqIterableを生成し、これらのメソッドを「遅延」方式で連鎖できるようにします。
  • linqIterableをToList、ToArray、ToMapなどの「コンクリート」オブジェクトに戻すメソッドがあります。

したがって、おそらく次のようなステートメントを許可する「流暢な」ライブラリを定義できます。

Map<String, Integer> results = Linq.FromIterable(sourceList)
                           .Where(new Predicate{public bool Op(SomeStruct in){return in.SomeString == "criteria";}})
                           .OrderBy(new Func{public String Op(SomeStruct in){return in.SomeOtherString;}})
                           .Select(new Func{public SomeOtherStruct Op(SomeStruct in){return new SomeOtherStruct(in.SomeOtherString, in.SomeInt);}})
                           .ToMap(new Func{public String Op(SomeOtherStruct in){return in.StringField;}},
                                  new Func{public Integer Op(SomeOtherStruct in){return in.IntField;}});

実際のライブラリの作成は、インターネットQ&Aでの回答の範囲をはるかに超える演習です。簡単ではありませんでした。

式ツリーはロケットサイエンスではありませんが、.NETがこの分野で持っているものを実装することは重要なプロジェクトになるでしょう。式ツリーを構築する機能が必要なだけでなく、エミットされたバイトコードを使用してこのツリーをその場で「コンパイル」できる必要があります。 Javaのリフレクションがそれほど強力であるかどうかはわかりません。

20
KeithS

見る:

8
Martijn Verburg

いいえ。Linqには、Javaにない多くの言語機能が必要です

5
Tom Squires

Scala を使用します ここで説明する理由

scalaの.NETポートを使用します。 LINQを含む.NETのすべてへの完全なネイティブアクセスを提供します。

できない場合は、 functionjavalambdaj のようなlibsを使用してみることができますが、実際にはLINQに近づくことはできません。

3
Landei

guava をライブラリのリストに追加して、LINQが行うことのいくつかを実現するのに役立つと思います。

しかし、他の人が指摘したように、純粋なJavaには同等のものはありません。

2

Javaには、linqを模倣するネイティブ機能はありません。ただし、同じ機能を提供するAPIがいくつかあります。

たとえば、このブログ投稿には、linqを複製するためのカスタムjarがあります。
http://javaworldwide.blogspot.in/2012/09/linq-in-Java.html

そして、これは投稿からのAPIの使用例です:

animalsのリストで表される名前とIDを含むAnimalオブジェクトがあるとします。リストanimalsから「o」を含むすべての動物の名前を取得するには、次のクエリを作成します。

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

ブログ投稿で参照されている他の2つのAPIがあります: lambdaJ および jLinq

2
vishnu

Clojureで記述されたSQLクエリのDSL Korma を使用できます。

構文はかなりきれいです:

(select user
  (with address)
  (fields :firstName :lastName :address.state)
  (where {:email "[email protected]"}))

これは、関連するClojureライブラリをインポートし、通常のClojure/Java相互運用機能を使用するだけで、Javaから簡単に呼び出すことができます。

2
mikera