LINQに相当するJavaは何ですか?
LINQに相当するJavaは何ですか?
回答:
LINQ for Javaに勝るものはありません。
...
編集する
Java 8でStream APIが導入されました。これは、コレクションを処理する場合と同様ですが、Linqとはまったく同じではありません。
Entity Frameworkなど、探しているORMの場合は、 Hibernate
:-)
代替ソリューション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();
ラムダは、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への移行についてもブログに書いています。
lambdajライブラリーを使用することにより、コレクション(およびその他)の項目をより読みやすい方法で選択できます
https://code.google.com/archive/p/lambdaj/
マジックストリングを使用しないため、Quaereライブラリよりもいくつかの利点があります。完全にタイプセーフであり、私の意見では、より読みやすいDSLを提供します。
javaccを使用しない限り、LINQに相当するものは見つかりません。独自の同等のものを作成を。
誰かがそうするための実行可能な方法を見つけるその日まで、いくつかの良い選択肢があります。
LINQ to Objects -JAVA 8は、値のストリームに対する関数スタイルの操作のサポートを追加するStream APIを追加しました:
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/
JavaにはLINQに相当するものが多数あります。比較については、こちらを参照してください。
タイプセーフなQuaere / LINQスタイルフレームワークの場合は、Querydslの使用を検討してください。Querydslは、JPA / Hibernate、JDO、SQL、およびJavaコレクションをサポートしています。
私はQuerydslのメンテナーなので、この答えは偏っています。
Java 8がラムダをサポートするようになったので、LINQによく似たJava APIを作成することができます。
Jinqは、Java用のこれらの新しいLINQスタイルライブラリの1つです。
私はこのライブラリの開発者です。これは、バイトコード分析を使用してJavaをデータベースクエリに変換する5年間の研究に基づいています。C#のD-LINQがEntity Frameworkの上にあるクエリレイヤーと同様に、JinqはJPAまたはjOOQの上にあるクエリレイヤーとして機能できます。集計、グループ、サブクエリをサポートしています。Erik Meijer(LINQの作成者)でさえ、Jinqを認めています。
SBQL4Jを参照。これは、Javaと統合されたタイプセーフな強力なクエリ言語です。複雑で多重にネストされたクエリを書くことができます。演算子はたくさんありますが、Javaメソッドはクエリ内でコンストラクタとして呼び出すことができます。クエリは純粋なJavaコードに変換されるため(実行時にリフレクションはありません)、実行は非常に高速です。
編集:まあ、これまでのところSBQL4Jは、LINQと同様のクエリ機能を提供するJava言語への唯一の拡張です。QuaereやJaQueのようないくつかの興味深いプロジェクトがありますが、これらは単なるAPIであり、コンパイル時に強力な型安全性を備えた構文/セマンティクスの拡張ではありません。
Java LINQ to SQL実装。.NET LINQと比較して、完全な言語統合とより大きな機能セットを提供します。
私はグーグルからグアバ図書館を試しました。それは持っている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ほど簡潔ではありませんが、面白そうです。
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);
私のライブラリ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でバックポートすることはできません。
もう1つの選択肢を追加するだけです。Java6には、javax.persistence.criteriaパッケージを使用したタイプセーフなデータベースクエリのソリューションがあります。
これは実際にはLINQではないと言う必要がありますが、LINQでは任意のIEnumerableをクエリできます。
これに使用できる非常に優れたライブラリがあります。
ここにあります:https : //github.com/nicholas22/jpropel-light
ただし、ラムダはJava 8まで利用できません。そのため、ラムダを使用することは少し異なり、自然に感じられません。
ここで誰もが話しているLinqはLinqToObjectsにすぎないようです。これは、Javaですでに今日実現できる機能だけを提供していると思いますが、構文は本当に醜いものです。
.NetのLinqの真の力として私が見ているのは、ラムダ式はデリゲートまたは式のいずれかを必要とするコンテキストで使用でき、適切な形式にコンパイルされるということです。これにより、LinqToSql(またはLinqToObjects以外の何か)が機能し、LinqToObjectsと同じ構文を使用できるようになります。
上記のプロジェクトはすべて、LinqToObjectsの機能のみを提供しているようです。これにより、LinqToSqlタイプの機能がJavaの地平線に近づいていないことがわかります。
基本的な機能コレクションについては、Java 8に組み込まれており、主要な非Java JVM言語のほとんど(Scala、Clojureなど)に組み込まれており、以前のバージョンのJavaのライブラリを追加できます。
SQLデータベースへの完全な言語統合アクセスのために、Scala(JVMで実行)にはSlickがあります。
LINQ(LINQ to Objects)の場合、Java 8には同等の機能があります。ProjectLambdaを参照してください。
これは、列挙の持っているオブジェクトの拡張へのLINQのように詰め込むを。しかし、ExpressionやExpressionTree などのより複雑なLINQの場合(LINQ to SQLやその他のLINQプロバイダーが最適化されたリアルなものを提供したい場合は、これらが必要です)、まだ同等のものはありませんが、将来的には見られるでしょう:)
しかし、将来的にはJavaでの宣言型クエリのようなものはないと思います。
Javaにはそのような機能はありません。他のAPIを使用すると、この機能を利用できます。同様に、名前とIDを含む動物オブジェクトがあるとします。動物オブジェクトを持つリストオブジェクトがあります。次に、リストオブジェクトから「o」を含むすべての動物の名前を取得する場合は、次のクエリを書くことができます
from(animals).where("getName", contains("o")).all();
上記のQueryステートメントは、名前に「o」のアルファベットを含む動物のリストを表示します。詳細については、次のブログをご覧ください。 http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
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);
}
多分あなたが望んでいる答えではないかもしれませんが、あなたのコードの一部がコレクション(検索、ソート、フィルタリング、変換、分析)に重い作業を必要とする場合、ClojureまたはScalaでいくつかのクラスを書くことを考慮するかもしれませんください。
彼らの機能的な性質のため、コレクションでの作業は彼らが得意とするものです。私はScalaの経験はあまりありませんが、Clojureを使用すると、おそらくより強力なLinqをすぐに見つけることができ、コンパイルすると、生成するクラスは残りのコードベースとシームレスに統合されます。
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
Scala.Now私はそれを読んで、linqのようにそれを見つけましたが、よりシンプルで読みにくいです。しかし、ScalaはLinuxで実行できますか?csharpにはモノが必要です。
プログラミング言語Pizza(Java拡張機能)がありましたので、それを見てください。-「流れるようなインターフェイス」の概念を使用して、宣言的な方法でデータをクエリします。これは、原則として、クエリ式を使用しないLINQ(http://en.wikipedia.org/wiki/Pizza_programming_language)と同じです。しかし、悲しいかな、それは追求されませんでしたが、LINQのようなものをJavaに取り込む1つの方法でした。
LINQ for Javaに相当するものはありません。しかし、のようなLINQのようなルックスで、外部APIのいくつかありhttps://github.com/nicholas22/jpropel-light、https://code.google.com/p/jaque/を
このライブラリを試すことができます: https //code.google.com/p/qood/
使用する理由は次のとおりです。