Javaには、Linqの機能の提供に近いライブラリはありますか?
完全なLINQクエリ構文を取得するには、新しいキーワードと構文構造をサポートする言語仕様とコンパイラを更新する必要があります。これは、ここでのほとんどの読者をはるかに超えています。
Linqのようなメソッドチェーン構文をJavaで表示し、C#のように機能させるには、2つのものが必要ですJavaはサポートしていません。拡張メソッド(インスタンスメソッドのようにインスタンスに適用できる静的メソッド)、およびラムダ式(匿名デリゲート)。ただし、これら2つは既存のJava構成体で偽装できます。あなたが少し余分なコーディングの冗長性を負いたいと思っているなら。Javaについて特に驚くべきことの1つは、匿名のインターフェース実装を作成する能力です;単一の純粋な関数を持つインターフェースに適用され、必要な各メソッドシグネチャのインターフェイスがある場合は、基本的にシンプルな匿名デリゲートを使用できます。
したがって、メソッドチェーンとしてのLinqのIEnumerable(Iterable for the Javaheads)側は、Javaで近似できるはずです。基本的に、モナドを制御する流暢なインターフェースとして実装します。 Iterableを実装するLinqIterable
のようなクラスが必要です。
したがって、おそらく次のようなステートメントを許可する「流暢な」ライブラリを定義できます。
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のリフレクションがそれほど強力であるかどうかはわかりません。
見る:
いいえ。Linqには、Javaにない多くの言語機能が必要です
scalaの.NETポートを使用します。 LINQを含む.NETのすべてへの完全なネイティブアクセスを提供します。
できない場合は、 functionjava や lambdaj のようなlibsを使用してみることができますが、実際にはLINQに近づくことはできません。
guava をライブラリのリストに追加して、LINQが行うことのいくつかを実現するのに役立つと思います。
しかし、他の人が指摘したように、純粋なJavaには同等のものはありません。
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();
Clojureで記述されたSQLクエリのDSL Korma を使用できます。
構文はかなりきれいです:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "[email protected]"}))
これは、関連するClojureライブラリをインポートし、通常のClojure/Java相互運用機能を使用するだけで、Javaから簡単に呼び出すことができます。