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 - 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への移行 についてのブログも投稿しました。
あなたはlambdajライブラリを使うことによってもっと読みやすい方法でコレクションの中の(そしてもっと多くの)アイテムを選択することができます。
https://code.google.com/archive/p/lambdaj/
これはQuaereライブラリに比べていくつかの利点があります。マジックストリングを一切使用せず、完全にタイプセーフであり、私の考えではより読みやすいDSLを提供しているからです。
オブジェクトへのLINQ - Java 8では、値のストリームに対する機能的な操作のサポートを追加するStream APIが追加されました。
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/
あなたはscalaを使うことができます、それは構文において似ています、そしてそれは実際にはおそらくlinqより強力です。
2014年の時点で、私はついにLINQがJava 8に登場したと言うことができます。LINQの代替を見つける必要はもうありません。
C#のような解決策は JaQue で、これはJava LambdasにExpression Treeを提供します。これに加えて、ドメイン固有のLINQプロバイダーを実装することができます。
Java 8がラムダをサポートするようになったので、LINQによく似たJava APIを作成することができます。
Jinq は、これらの新しいLINQスタイルのJava用ライブラリの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のみであり、コンパイル時の強い型安全性を持つ構文/意味拡張ではありません。
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ほど簡潔ではありませんが、面白そうです。
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);
もう1つの選択肢を追加するだけです。Java6には、 javax.persistence.criteria パッケージを使用した、型保証されたデータベースクエリ用のソリューションがあります。
LINQを使用すると、IEnumerableを照会できるので、これは実際にはLINQではないと言う必要があります。
これに使える、とても良いライブラリがあります。
ここにあります: https://github.com/nicholas22/jpropel-light
ただし、ラムダはJava 8まで利用できないので、それを使用するのは少し異なり、自然に感じられません。
私のライブラリ 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でバックポートすることはできません。シリアル化されたラムダを使用してください。
みんながここで話しているのは、LinqToObjectだけです。これは、今日Javaですでに達成されている機能を提供しているだけで、本当に醜い構文を使用していると私は信じています。
.NetでLinqの真の力として私が見るのは、ラムダ式はデリゲートか式のいずれかを必要とする文脈で使用することができ、そして適切な形式にコンパイルされるということです。これが、LinqToSql(またはLinqToObjects以外のもの)のようなものが機能することを可能にし、それらがLinqToObjectsと同一の構文を持つことを可能にするものです。
上記のすべてのプロジェクトがLinqToObjectsの機能を提供しているだけのようです。そのため、LinqToSqlタイプの機能はJavaには向いていません。
基本的な機能コレクションとしては、Java 8が組み込まれており、Java以外の主要なJVM言語のほとんど(Scala、Clojureなど)が組み込まれており、以前のJavaバージョン用のlibを追加することができます。
SQLデータベースへの全言語統合アクセスのために、Scala(JVM上で動作)は Slick を持っています。
LINQ(LINQ to Objects)に関しては、Java 8は同等のものを持つでしょう。 Project Lambda を見てください。
それはEnumerableの LINQ to Objects拡張 like stuffs を持っています。しかし、 Expression やExpressionTree(最適化された本物のものを提供したいのであれば、これらはLINQ to SQLや他のLINQプロバイダに必要です)のようなもっと複雑なLINQのものに関して:)
しかし、将来的にはJavaに対する宣言型クエリのようなものはないと思います。
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);
}
Javaにはそのような機能はありません。他のAPIを使用することによって、あなたはこの機能を手に入れるでしょう。名前とIDを含む動物オブジェクトがあるとします。動物オブジェクトを持つリストオブジェクトがあります。リストオブジェクトから 'o'を含むすべての動物の名前を取得したいのであれば。次のようなクエリを書くことができます
from(animals).where("getName", contains("o")).all();
上記のクエリステートメントは、名前に「o」のアルファベットが含まれている動物のリストを表示します。詳しくは下記のブログをご覧ください。 http://javaworldwide.blogspot.in/2012/09/linq-in-Java.html
JaQuはJavaのLINQ版です。 H2データベース用に開発されましたが、JDBCを使用しているため、どのデータベースでも機能するはずです。
Scala.Now私はそれを読んで、そしてlinqのようにそれを見つけました、しかしもっと単純でそしてもっと読めない。しかし、scalaはLinuxでも動作します。 csharpはモノが必要です。
匿名ユーザーが別のユーザーに言及しました、 Diting :
Ditingは、チェーン可能なメソッドと.NETのLinqのような匿名インタフェースを通じて、コレクションに対するクエリ機能を提供するクラスライブラリです。静的メソッドを使用している他のほとんどのコレクションライブラリとは異なり、コレクション全体を繰り返す必要があります。Ditingは、コレクションまたは配列にクエリを実装するための遅延チェーン可能メソッドを含むコアEnumerableクラスを提供します。
サポートされているメソッド:any、cast、contact、contains、count、distinct、elementAt。 、skipWhile、take、takeWhile、toArray、toArrayList、共用体、ここで
HQL (Hibernate Query Language)
は.Net
のLinq
と非常によく似ています
Javaの"Linq to SQL"
相当物ではありません。しかしそれに近い何か。 クエリDSL
あなたはこのライブラリを試すことができます: https://code.google.com/p/qood/
これを使用するいくつかの理由はここにあります:
恥知らずなセルフプラグ:あなたはいつも https://github.com/amoerie/jstreams を使うことができます
Java 6以上で動作します。Android開発に最適です。
Scalaの演算子、lodash、C#LINQなどによく似ています。
LINQ for Javaに相当するものはありません。しかし、 https://github.com/nicholas22/jpropel-light 、 https://code.google.com/p/のようなLINQのように見える外部APIがいくつかあります。 jaque/
プログラミング言語Pizza(Java拡張機能)がありましたので、ぜひご覧ください。 - 「流暢なインターフェース」の概念を使用して宣言的にデータを照会します。これは原則として、照会式なしのLINQ(http://en.wikipedia.org/wiki/Pizza_programming_language)と同じです。しかし残念ながらこれは追求されていませんでしたが、LINQに似たものをJavaに取り込むための1つの方法でした。
Java Functional Utilsを使ってC#の101 LINQの例を変換できます これはAndroid上のJava 1.7と互換性があります。