あのようなものLINQのためのJava?[定休日]
質問
を習い始めたのLINQ C#.
特にLINQらオブジェクトとLINQる形式をサポートしています。
楽しかったの力でLINQ.
があるのを知ったというおもしろい JLINQ a Jscriptの実装です。
もしCatbert掲Scalaて LINQ
い場合はLINQうのを参照することができるものとJava7?
更新:興味深いポストから2008年 LINQのためのJavaツール
解決
見 Scala, は、強力な機能性プログラミング言語のものに似たJava ール作業を開発する上でJavaプラットフォーム.
にScalaの使用が可能で基本的に同じコードを構築しましてLINQも特別なクエリ構文の理解の存在であり、C#とVB.
編集:
以下に例を示しますのScalaの照会機能:
// Get all StackOverflow users with more than 20,000 reputation points.
val topUsers = for{
u <- users
if u.reputation > 20000
} yield u;
println ("Users with more than 20,000 reputation:")
for (u <- topUsers) {
println u.name
}
他のヒント
においてもっとも重要なことLINQはしてもらうこととなる。:
- Monadic理解
- データベースの統合
- SQLによく似た構文
- AST操作
人はだいて聞かれたことがあるでしょうかいのかと思うのだとしてデータベース統合しました。での勤務経験がある人は少しでも考えSQLインジェクションのような構文です。人は本当に掘りすることはできませんのmonadic理解の面でも、知らないためにあります。
ばスカラは、例えば、monadic理解なのです。あるライブラリと呼ばれ ScalaQuery を提供するデータベースの統合を通じてmonadic理解の性能の主な理由monadsている).他のプロジェクトと呼ばれる ScalaQL, と思いを提供してほとんど同じものが使用コンパイラのプラグインを強化します。私は知らなかったのミゲル-ガルシアの作品ですが、見たその他のものその実現に嬉しいです。
一つは必要ありません特別な構文になmonadic理解しています。それだけでも揮による定型.その点で瞬時にご利用言語のレベルのジェネリック医薬品のメリットです。
もScalaないます。第一に、SQL-like syntax.ることもできなかった:SQL構文に見えのついたスカラ.かえる最もScalaプログラマを望んで滞在する身近なものとな--いわゆるための理解.
その他のものは、いつしかし、AST ーションにも最適です。とする機能を操作したコードの構文解析によるコンパイラがな変形バイトコードを付与する機能を変更する前の生成が完了します。
と思うようなものがjt:スカラ--画は、使用言語を問いません。が、しかし、背景となるプログラマがする機能を変更コードされているため、それぞれ神様から与えられた。.純ではないでLINQので、できるその他の言語など、Rubyなどがある。
LINQが原因クロージャの現在の不足のために、Javaでは難しいだろう。 の合理的にコンパクトな閉鎖のサポートと拡張メソッドを取得しない、それはクエリ式と同等のものを取得していない場合でも、「ドット表記」の面でLINQを実行可能でなければならないのJava 7が本当にを仮定します。
Googleのコレクションライブラリの(今1.0で - しかし、<によって交換しますそれは準備ができているのhref =「http://code.google.com/p/guava-libraries/」のrel =「noreferrer」>グァバのは)必要なメソッドの多く含まれている - と私はないだろう101 LINQのようなAPIは、すぐに閉鎖のサポートが合理的に最終的に見えるよう跳ね上がる見て驚いています。
私はしかし、Javaは式ツリーのようなものを得る(現時点で)見ることができない - 私はあなたがカスタムコンパイルを持っていない限り、あなたがオブジェクトにLINQに限定されます疑いがある
。lambdaj のライブラリを使用することによって、あなたは、トップ評判のユーザーを見つけることができます。
List<User> topUsers =
select(users, having(on(User.class).getReputation(), greaterThan(20000)));
それはどんな魔法の文字列を使用していないので、それは完全に安全と入力して、私の意見では、より読みやすいDSLを提供していますいくつかの利点がQuaereライブラリを尊重しています。
の Quaere のにチェックしてください。それはあなたがライブラリとして含めることができるJava用のLINQのようなDSLです。例:
// Get all StackOverflow users with more than 20,000 reputation points.
Iterable<User> topUsers = from("u").in(entityManager.entity(User.class)).
where(gt("u.getReputation()", 20000)).
select("u");
System.out.println("Users with more than 20,000 reputation:");
for (User u : topUsers) {
System.out.println(u.getName());
}
しかし、Javaは拡張メソッドに類似した概念を持っていないことに注意してください。 Quaereでどのようなのはかなりあなたが立ち往生しているとのことです。あなたがあなた自身の特別なユーティリティを作成する必要がある場合、彼らはおそらく別のユーティリティクラス(ICK)にする必要があります。
また、Javaの<7はネイティブクロージャを持っていないので、あなたは物事を参照するための文字列で立ち往生している、とあなたが何かを間違えた場合、あなたのIDEは、あなたの問題を示すために、それらをイントロスペクトすることはできません。 (誰かがQuaereのためのイントロスペクションのプラグインを作成した場合、よりスマートなIDEは、しかし、この欠点に対処することができるかもしれません。)
あなたは、コレクションのチェーン可能クエリメソッドを実装している diting を試みることができます。
Integer[] values = new Integer[] {0,1,2,3,4,5,6,7,8,9,10};
Enumerable<Integer> query = new Enumerable<Integer>(values).where(new Predicate<Integer>(){
@Override
public boolean evaluate(Integer value) throws Exception {
return value % 2 == 0;
}});
for(Integer i : query)
{
System.out.write(i);
System.out.write('\n');
}
CQEngineまたはコレクションクエリーエンジン http://code.google.com/p/cqengine/非常に有望と思われます。しかし、それを試していません。それはあなたがコレクションの上にインデックスを構築し、それらを照会することができます。非常に速いことになっています。
JVM上のLINQ-2-SQLとして使用するような単純なものはありますか?私はいくつかのツールを使用してDBスキーマからのエンティティ(クラス)を生成し、DBと直接対話するために、これらを使用したいです。 XML-無料の解決策はありますか?私は、クラスに注釈を付けるする必要がありますする必要はありません。 .NETでは、ツールがsqlmetalと呼ばれています。それはいわば、すべてのDBクラスを生成し、プリプロセッサの一種です。
これが完了すると、、私はScalaの言語構造に組み込まれたを使用することはかなり簡単であると思います。