@craastad Als .NET-Typ, der jetzt hauptsächlich in der Java-Welt steckt, fühle ich deinen Schmerz. Sie sollten jedoch Scala ausprobieren - erstklassige Funktionen / Abschlüsse, um das Verständnis zu verbessern (nicht dasselbe wie die Abfragesyntax von LINQ, aber in vielen der gleichen Situationen nützlich), ein einheitliches Typsystem, Typinferenz, einige praktische Problemumgehungen für das generische Löschen von Typen ... alle laufen auf der JVM und arbeiten mit Java zusammen. Plus eine Reihe anderer funktionaler Vorteile wie Mustervergleich, Optionstyp usw.
Tim Goodman
Antworten:
808
Es gibt nichts Schöneres als LINQ für Java.
...
Bearbeiten
Mit Java 8 werden wir nun in die Stream-API eingeführt . Dies ist ähnlich, wenn es um Sammlungen geht, aber es ist nicht ganz dasselbe wie bei Linq.
Wenn es sich um ein ORM handelt, nach dem Sie suchen, wie z. B. Entity Framework, können Sie den Ruhezustand ausprobieren
Ist etwas im Plan? in die Sprache integriert? Gibt es eine JCP-Nummer? etc etc.
Cheeso
6
Sehr wahr, obwohl ein großer Teil dessen, was LINQ sooo schön macht, darin besteht, wie tief es in die Sprache und den Compiler integriert ist
AgileJon
11
Entschuldigung, das "sehr wahre" war für 280Z28 gedacht. Ich weiß nicht, ob es dafür ein JCP gibt. LINQ erforderte mehrere Änderungen an der C # -Sprache, da ich angesichts der Geschwindigkeit, mit der das JCP arbeitet, den Atem nicht anhalten würde.
LINQ ist eine Spezifikation, keine Implementierung ... Lambda-Ausdrücke sind Teil von LINQ. Alle Projekte, die versuchen, LINQ nach Java zu portieren, sind Implementierungen für ein konkretes Szenario (SQL, Objekte ...), decken jedoch nicht das Hauptziel von LINQ ab: Integrieren Sie die Sprachabfrage in den Code. Aus diesem Grund gibt es derzeit keine echte Alternative oder Initiative, die als Alternative betrachtet werden kann.
Coolection hat nicht vorgetäuscht, das neue Lambda zu sein, aber wir sind von alten Java-Legacy-Projekten umgeben, bei denen diese Bibliothek helfen wird. Es ist wirklich einfach zu verwenden und zu erweitern und deckt nur die am häufigsten verwendeten Iterationsaktionen über Sammlungen ab:
Zeichenfolge für den Spaltennamen, was bedeutet, dass die automatische Vervollständigung von Compiler und IDE nicht gegen Tippfehler hilft und das Refactoring schwierig ist. Pläne, das zu ändern?
Ekevoo
2
Hallo Ekevoo. Ich denke, dass es großartig sein wird und ich habe versucht, das irgendwann zu tun. In diesem Moment ist die Coollection mit Java 8 eine veraltete Bibliothek. Vielleicht ist es nützlich für älteste Projekte ... Was denkst du?
19WAS85
1
@WagnerAndrade Das letzte Commit ist vor 5-6 Jahren. Ich gehe davon aus, dass die Funktionalität weitgehend durch Java 8 ersetzt wurde? Auch sehr cooler Name :)
Lesen Sie die Artikel von Brian Goetz zu Lambdas, um ein gutes Verständnis für die Implementierung von Lambdas in JDK8 zu erhalten, und lernen Sie gleichzeitig Streams, interne Iterationen, Kurzschlüsse und Konstruktorreferenzen kennen. Weitere Beispiele finden Sie in den obigen JSRs .
Ich habe einen Blog über einige der Vorteile der Verwendung von Lambdas in JDK8 mit dem Namen The Power of the Arrow geschrieben . NetBeans 8 bietet auch hervorragende Unterstützung für die Konvertierung von Konstrukten in JDK8, über die ich auch über die Migration auf JDK 8 mit NetBeans gebloggt habe .
Waren Lambdas nicht auch für Java 7 geplant? Was ist damit passiert?
BlueRaja - Danny Pflughoeft
7
Oracle kaufte Sun (Zunge in der Wange). Java 7 dauerte viel zu lange (5 Jahre), so dass Lambdas die Shortlist verpassten. Dies war für die Massen eher enttäuschend. Davon abgesehen sieht es so aus, als würde Oracle den Ball abholen, und ich denke, wir sind für den 8. Oktober nächsten Jahres in Java geplant.
Brett Ryan
1
Beachten Sie, dass der Zustand des Lambda erneut aktualisiert wurde und nun Streams, interne Iterationen, Kurzschlüsse und Konstruktorreferenzen abdeckt. Ich rate Ihnen allen, das neue Dokument zu lesen.
Brett Ryan
6
Lambda-Ausdrücke sind ein kleiner Teil von LINQ.
Sesispla
4
@NeWNeO, wenn Sie sich auf die Abfragesprache in C # beziehen, dann kommt ja nichts in Java, aber meiner Erfahrung nach bevorzugen die meisten erfahrenen C # -Entwickler die Lambda-Syntax gegenüber der Abfragesprache. Wenn Sie sich jedoch beispielsweise auf LINQ-to-Entities beziehen, werden Sie feststellen, dass Lambdas in Java dies und mehr ermöglichen. Java 8 bietet noch viel mehr Möglichkeiten, um dies zu ermöglichen, z. B. Verteidigungsmethoden .
Brett Ryan
119
Mithilfe der Lambdaj-Bibliothek können Sie die Elemente in einer Sammlung (und vieles mehr) besser lesbar auswählen
Es hat einige Vorteile gegenüber der Quaere-Bibliothek, da es keine magische Zeichenfolge verwendet, absolut typsicher ist und meiner Meinung nach ein besser lesbares DSL bietet.
Das ist schön, aber es ist weit davon entfernt, eine Abfrage zu erstellen und erneut auszuführen. SQL, XML, Sammlung usw.
Bytebender
Warum erhalte ich möglicherweise java.lang.ExceptionInInitializerError, wenn ich Lambdaj Select für eine benutzerdefinierte Klasse in meinem Android-Projekt verwende?
Topwik
1
+1 Dies ist wirklich gut für diejenigen von uns, die sich nicht für SQL / XML interessieren und nur einen einfacheren Zugriff auf Sammlungen wünschen.
Asche999
101
Sie werden kein Äquivalent zu LINQ finden, es sei denn, Sie verwenden den Javacc , um Ihr eigenes Äquivalent zu erstellen.
Bis zu dem Tag, an dem jemand einen praktikablen Weg findet, gibt es einige gute Alternativen, wie z
github.com/TrigerSoft/jaque hat diesen Weg gefunden und lässt Ausdrucksbäume erstellen. In Kombination mit Java 8 Lambdas kann jede LINQ-Kapazität mit dem gleichen Aufwand wie in .Net implementiert werden.
LINQ zu SQL / NHibernate / etc. (Datenbankabfrage) - Eine Option wäre die Verwendung von JINQ, das auch die neuen JAVA 8-Funktionen verwendet und am 26. Februar 2014 auf Github veröffentlicht wurde: https://github.com/my2iu/Jinq
Jinq bietet Entwicklern eine einfache und natürliche Möglichkeit, Datenbankabfragen in Java zu schreiben. Sie können Datenbankdaten wie normale Java-Objekte behandeln, die in Sammlungen gespeichert sind. Sie können sie durchlaufen und mit normalen Java-Befehlen filtern. Der gesamte Code wird automatisch in optimierte Datenbankabfragen übersetzt. Schließlich sind Abfragen im LINQ-Stil für Java verfügbar!
Ich bin mir nicht sicher, warum die Leser Ihre Antwort nicht beachtet haben, obwohl die Stream-API der LINQ am nächsten kommt!
Rafid
3
Streams API ist im Vergleich zu LINQ ein schlechter Witz.
Andrei Rînea
1
Sorry Mann, will nicht unhöflich sein. Ich suchte nach einem LINQ-Äquivalent, nachdem ich mir mit der Streams-API den Kopf verdreht hatte. Ich wollte nur sagen, dass es kein echtes Äquivalent ist, das ist alles.
Andrei Rînea
1
@ AndreiRînea Suchen Sie nach gleichwertigen Funktionen für LINQ-Anbieter (LINQ zu XML, LINQ zu JSON, LINQ zu NHibernate usw.)?
Răzvan Flavius Panda
2
Alles, was ich brauchte, war ein Mittel, um eine Sammlung zu gruppieren und zu maximieren. Es gelang mir schließlich, aber mit viel Aufwand und zu viel Code.
Quaere sieht so aus, als würde es ein bisschen von dem liefern, was LINQ bietet, aber die Frage ist nach einem "Äquivalent"
AgileJon
6
Es ist also etwas wie LINQ, wenn nicht ein direktes Äquivalent? Das klingt zumindest hilfreich
Brian Agnew
3
@AgileJon: Wenn er wirklich gleichwertig gemeint hätte, hätte er nicht gefragt. Er hätte tippen from x in xs select xund die Antwort herausfinden können (nein).
kizzx2
18
Es gibt viele LINQ-Entsprechungen für Java, siehe hier für einen Vergleich.
Erwägen Sie für ein typsicheres Quaere / LINQ-Framework die Verwendung von Querydsl . Querydsl unterstützt JPA / Hibernate-, JDO-, SQL- und Java-Sammlungen.
Ich bin der Betreuer von Querydsl, daher ist diese Antwort voreingenommen.
Jetzt, da Java 8 Lambdas unterstützt, ist es möglich, Java-APIs zu erstellen, die LINQ sehr ähnlich sind.
Jinq ist eine dieser neuen LINQ-Bibliotheken für Java.
Ich bin der Entwickler dieser Bibliothek. Es basiert auf fünf Jahren Forschung zur Verwendung der Bytecode-Analyse zur Übersetzung von Java in Datenbankabfragen. Ähnlich wie C # D-LINQ eine Abfrageebene ist, die über dem Entity Framework liegt, kann Jinq als Abfrageebene über JPA oder jOOQ fungieren. Es unterstützt Aggregation, Gruppen und Unterabfragen. Sogar Erik Meijer (der Schöpfer von LINQ) hat Jinq anerkannt .
Siehe SBQL4J . Es ist eine typsichere, starke Abfragesprache, die in Java integriert ist. Ermöglicht das Schreiben komplizierter und mehrfach verschachtelter Abfragen. Es gibt viele Operatoren, Java-Methoden können als Konstruktoren in Abfragen aufgerufen werden. Abfragen werden in reinen Java-Code übersetzt (zur Laufzeit gibt es keine Reflexion), sodass die Ausführung sehr schnell erfolgt.
EDIT: Nun, bis jetzt ist SBQL4J die EINZIGE Erweiterung der Java-Sprache, die ähnliche Abfragefunktionen wie LINQ bietet. Es gibt einige interessante Projekte wie Quaere und JaQue, aber es handelt sich nur um APIs, nicht um Syntax- / Semantik-Erweiterungen mit hoher Typensicherheit in der Kompilierungszeit.
Kann ich mit JaQue XML-Dateien genauso lesen / schreiben wie mit LINQ?
Khurram Majeed
7
Ich habe Guavenbibliotheken von Google ausprobiert . Es hat eine, von FluentIterableder ich denke, dass sie LINQ nahe kommt. Siehe auch FunctionalExplained .
List<String> parts =newArrayList<String>();// add parts to the collection. FluentIterable<Integer> partsStartingA =FluentIterable.from(parts).filter(newPredicate<String>(){@Overridepublicboolean apply(finalString input){return input.startsWith("a");}}).transform(newFunction<String,Integer>(){@OverridepublicInteger apply(finalString input){return input.length();}});
Scheint eine umfangreiche Bibliothek für Java zu sein. Sicher nicht so prägnant wie LINQ, sieht aber interessant aus.
Sie können meine Bibliothek CollectionsQuery ausprobieren . Es ermöglicht die Ausführung von LINQ-ähnlichen Abfragen über Sammlungen von Objekten. Sie müssen ein Prädikat übergeben, genau wie in LINQ. Wenn Sie Java6 / 7 verwenden, müssen Sie die alte Syntax für Schnittstellen verwenden:
Wenn Sie DB-Abfragen ausführen müssen, können Sie, wie oben erwähnt, auf JINQ schauen, es kann jedoch nicht von RetroLambda zurückportiert werden, um serialisierte Lambdas zu verwenden.
Es klingt so, als wäre der Linq, von dem hier alle sprechen, nur LinqToObjects. Was meiner Meinung nach nur Funktionen bietet, die bereits heute in Java ausgeführt werden können, aber mit wirklich hässlicher Syntax.
Was ich als die wahre Stärke von Linq in .Net sehe, ist, dass Lambda-Ausdrücke in einem Kontext verwendet werden können, der entweder einen Delegaten oder einen Ausdruck erfordert, und dann in die entsprechende Form kompiliert werden. Auf diese Weise können Dinge wie LinqToSql (oder etwas anderes als LinqToObjects) funktionieren und eine Syntax haben, die mit LinqToObjects identisch ist.
Es sieht so aus, als ob alle oben genannten Projekte nur die Funktionen von LinqToObjects bieten. Aus diesem Grund ist die Funktionalität vom Typ LinqToSql für Java nicht in Sicht.
Für grundlegende Funktionssammlungen ist Java 8 integriert, die meisten wichtigen Nicht-Java-JVM-Sprachen (Scala, Clojure usw.) und Sie können zusätzliche Bibliotheken für frühere Java-Versionen erhalten.
Für den vollsprachigen integrierten Zugriff auf eine SQL-Datenbank verfügt Scala (läuft auf der JVM) über Slick
Für LINQ (LINQ to Objects) hat Java 8 etwas Äquivalentes, siehe Project Lambda .
Es hat Enumerables LINQ to Objects-Erweiterungen wie Stuff . Aber für kompliziertere LINQ-Dinge wie Expression und ExpressionTree (diese werden für LINQ to SQL und andere LINQ-Anbieter benötigt, wenn sie etwas Optimiertes und Reales bereitstellen möchten) gibt es noch kein Äquivalent, aber vielleicht werden wir das in Zukunft sehen :)
Aber ich glaube nicht, dass es in Zukunft so etwas wie deklarative Abfragen unter Java geben wird.
In Java gibt es keine solche Funktion. Wenn Sie die andere API verwenden, erhalten Sie diese Funktion. Nehmen wir an, wir haben ein Tierobjekt, das Name und ID enthält. Wir haben Listenobjekte mit Tierobjekten. Wenn wir nun den gesamten Tiernamen, der 'o' enthält, vom Listenobjekt erhalten möchten. Wir können die folgende Abfrage schreiben
JaQu ist das LINQ-Äquivalent für Java. Obwohl es für die H2-Datenbank entwickelt wurde, sollte es für jede Datenbank funktionieren, da es JDBC verwendet.
Vielleicht nicht die Antwort, auf die Sie hoffen, aber wenn ein Teil Ihres Codes umfangreiche Arbeiten an Sammlungen (Suchen, Sortieren, Filtern, Transformationen, Analysen) erfordert, können Sie in Betracht ziehen, einige Klassen in Clojure oder Scala zu schreiben .
Aufgrund ihrer funktionalen Natur ist die Arbeit mit Kollektionen das, was sie am besten können. Ich habe nicht viel Erfahrung mit Scala, aber mit Clojure finden Sie wahrscheinlich einen leistungsstärkeren Linq an Ihren Fingerspitzen. Nach dem Kompilieren lassen sich die von Ihnen erstellten Klassen nahtlos in den Rest der Codebasis integrieren.
Groovy oder jRuby wären ebenfalls brauchbare Kandidaten, da sie alle einen viel funktionaleren Charakter haben.
Cdeszaq
1
Ein anonymer Benutzer erwähnte einen anderen, Diting :
Diting ist eine Klassenbibliothek, die Abfragefunktionen für Sammlungen über verkettbare Methoden und eine anonyme Schnittstelle wie Linq in .NET bereitstellt. Im Gegensatz zu den meisten anderen Sammlungsbibliotheken, die statische Methoden verwenden, muss die gesamte Sammlung iteriert werden. Diting bietet einen Kern der Enumerable-Klasse, der verzögerte verkettbare Methoden zum Implementieren von Abfragen für Sammlungen oder Arrays enthält.
Scala benötigt eine Java-Laufzeit, um ausgeführt zu werden: Es funktioniert nicht unbedingt bei einer reinen Linux-Installation, je nachdem, welche Komponenten Sie installieren.
Rup
@ Rup gibt es vollständig kompatible JRE für GNU / Linux, und Mono ist keine vollständig kompatible .NET-Implementierung.
Anzeigename
@Sarge Das war nicht mein Punkt, aber Mono läuft LINQ gut genug, nicht wahr? Außerdem gibt es jetzt Microsofts eigenen .Net Core für Linux .
Rup
(GNU /) Linux ist neben Windows nicht die einzige Plattform, und JRE gibt es für eine Vielzahl von Plattformen. Mono implementiert nicht alles vollständig, zum Beispiel gibt es kein WPF.
Anzeigename
0
Es gab die Programmiersprache Pizza (eine Java-Erweiterung) und Sie sollten einen Blick darauf werfen. - Es verwendet das Konzept der "fließenden Schnittstellen", um Daten deklarativ abzufragen. Dies ist im Prinzip identisch mit LINQ ohne Abfrageausdrücke (http://en.wikipedia.org/wiki/Pizza_programming_language). Aber leider wurde es nicht weiterverfolgt, aber es wäre eine Möglichkeit gewesen, etwas Ähnliches wie LINQ in Java zu bringen.
Sicher wurde es verfolgt, nur nicht unter dem Namen "Pizza". Die Generika von Pizza wurden in GJ zusammengeführt, das dann zum Java 1.3-Referenzcompiler wurde (obwohl Generika bis 1.5 hinter einem Flag versteckt waren). In der Zwischenzeit ... wurde der Rest der Ideen und ein paar zusätzliche zu Scala.
Kevin Wright
Danke für diese Info, natürlich ist Scala hier ein guter Punkt. Diese Fähigkeiten wurden jedoch nicht in die Java-Sprache integriert. Sie können die Scala-Sprache verwenden, um den netten Abfragecode zu implementieren und die resultierende Binärdatei dann aus Java zu verwenden.
Antworten:
Es gibt nichts Schöneres als LINQ für Java.
...
Bearbeiten
Mit Java 8 werden wir nun in die Stream-API eingeführt . Dies ist ähnlich, wenn es um Sammlungen geht, aber es ist nicht ganz dasselbe wie bei Linq.
Wenn es sich um ein ORM handelt, nach dem Sie suchen, wie z. B. Entity Framework, können Sie den Ruhezustand ausprobieren
:-)
quelle
Es gibt eine alternative Lösung, Coollection .
Coolection hat nicht vorgetäuscht, das neue Lambda zu sein, aber wir sind von alten Java-Legacy-Projekten umgeben, bei denen diese Bibliothek helfen wird. Es ist wirklich einfach zu verwenden und zu erweitern und deckt nur die am häufigsten verwendeten Iterationsaktionen über Sammlungen ab:
quelle
Lambdas sind jetzt in Java 8 in Form von JSR-335 - Lambda Expressions für die JavaTM-Programmiersprache verfügbar
UPDATE : JDK8 wurde jetzt veröffentlicht, das das Projekt Lambda enthält. Es lohnt sich, eine Kopie von Java 8 in Aktion zu erwerben, die derzeit noch MEAP ist.
Lesen Sie die Artikel von Brian Goetz zu Lambdas, um ein gutes Verständnis für die Implementierung von Lambdas in JDK8 zu erhalten, und lernen Sie gleichzeitig Streams, interne Iterationen, Kurzschlüsse und Konstruktorreferenzen kennen. Weitere Beispiele finden Sie in den obigen JSRs .
Ich habe einen Blog über einige der Vorteile der Verwendung von Lambdas in JDK8 mit dem Namen The Power of the Arrow geschrieben . NetBeans 8 bietet auch hervorragende Unterstützung für die Konvertierung von Konstrukten in JDK8, über die ich auch über die Migration auf JDK 8 mit NetBeans gebloggt habe .
quelle
Mithilfe der Lambdaj-Bibliothek können Sie die Elemente in einer Sammlung (und vieles mehr) besser lesbar auswählen
https://code.google.com/archive/p/lambdaj/
Es hat einige Vorteile gegenüber der Quaere-Bibliothek, da es keine magische Zeichenfolge verwendet, absolut typsicher ist und meiner Meinung nach ein besser lesbares DSL bietet.
quelle
Sie werden kein Äquivalent zu LINQ finden, es sei denn, Sie verwenden den Javacc , um Ihr eigenes Äquivalent zu erstellen.
Bis zu dem Tag, an dem jemand einen praktikablen Weg findet, gibt es einige gute Alternativen, wie z
quelle
LINQ to Objects - JAVA 8 hat die Stream-API hinzugefügt, die Unterstützung für Operationen im funktionalen Stil für Werteströme bietet:
Paket java.util.stream
Java 8 erklärt: Anwenden von Lambdas auf Java-Sammlungen
LINQ zu SQL / NHibernate / etc. (Datenbankabfrage) - Eine Option wäre die Verwendung von JINQ, das auch die neuen JAVA 8-Funktionen verwendet und am 26. Februar 2014 auf Github veröffentlicht wurde: https://github.com/my2iu/Jinq
JINQ-Projektseite: http://www.jinq.org/
quelle
Es gibt ein Projekt namens quaere .
Es ist ein Java-Framework, das die Möglichkeit bietet, Sammlungen abzufragen.
Hinweis: Laut Autor wird das Projekt nicht mehr gepflegt.
quelle
from x in xs select x
und die Antwort herausfinden können (nein).Es gibt viele LINQ-Entsprechungen für Java, siehe hier für einen Vergleich.
Erwägen Sie für ein typsicheres Quaere / LINQ-Framework die Verwendung von Querydsl . Querydsl unterstützt JPA / Hibernate-, JDO-, SQL- und Java-Sammlungen.
Ich bin der Betreuer von Querydsl, daher ist diese Antwort voreingenommen.
quelle
Sie können Scala verwenden, es hat eine ähnliche Syntax und ist wahrscheinlich leistungsfähiger als Linq.
quelle
Wie im Jahr 2014 kann ich endlich sagen, dass LINQ endlich in Java 8 verfügbar ist. Sie müssen also keine Alternative mehr zu LINQ finden.
quelle
Jetzt, da Java 8 Lambdas unterstützt, ist es möglich, Java-APIs zu erstellen, die LINQ sehr ähnlich sind.
Jinq ist eine dieser neuen LINQ-Bibliotheken für Java.
Ich bin der Entwickler dieser Bibliothek. Es basiert auf fünf Jahren Forschung zur Verwendung der Bytecode-Analyse zur Übersetzung von Java in Datenbankabfragen. Ähnlich wie C # D-LINQ eine Abfrageebene ist, die über dem Entity Framework liegt, kann Jinq als Abfrageebene über JPA oder jOOQ fungieren. Es unterstützt Aggregation, Gruppen und Unterabfragen. Sogar Erik Meijer (der Schöpfer von LINQ) hat Jinq anerkannt .
quelle
Siehe SBQL4J . Es ist eine typsichere, starke Abfragesprache, die in Java integriert ist. Ermöglicht das Schreiben komplizierter und mehrfach verschachtelter Abfragen. Es gibt viele Operatoren, Java-Methoden können als Konstruktoren in Abfragen aufgerufen werden. Abfragen werden in reinen Java-Code übersetzt (zur Laufzeit gibt es keine Reflexion), sodass die Ausführung sehr schnell erfolgt.
EDIT: Nun, bis jetzt ist SBQL4J die EINZIGE Erweiterung der Java-Sprache, die ähnliche Abfragefunktionen wie LINQ bietet. Es gibt einige interessante Projekte wie Quaere und JaQue, aber es handelt sich nur um APIs, nicht um Syntax- / Semantik-Erweiterungen mit hoher Typensicherheit in der Kompilierungszeit.
quelle
Java LINQ to SQL- Implementierung. Bietet vollständige Sprachintegration und größere Funktionen im Vergleich zu .NET LINQ.
quelle
Ich habe Guavenbibliotheken von Google ausprobiert . Es hat eine, von
FluentIterable
der ich denke, dass sie LINQ nahe kommt. Siehe auch FunctionalExplained .Scheint eine umfangreiche Bibliothek für Java zu sein. Sicher nicht so prägnant wie LINQ, sieht aber interessant aus.
quelle
https://code.google.com/p/joquery/
Unterstützt verschiedene Möglichkeiten,
Gegebene Sammlung,
vom Typ,
Filter
Java 7
Java 8
Ebenfalls,
Sortieren (auch für Java 7 verfügbar)
Gruppierung (auch für Java 7 verfügbar)
Joins (auch für Java 7 verfügbar)
Gegeben,
Kann verbunden werden wie,
Ausdrücke
quelle
Sie können meine Bibliothek CollectionsQuery ausprobieren . Es ermöglicht die Ausführung von LINQ-ähnlichen Abfragen über Sammlungen von Objekten. Sie müssen ein Prädikat übergeben, genau wie in LINQ. Wenn Sie Java6 / 7 verwenden, müssen Sie die alte Syntax für Schnittstellen verwenden:
Sie können es auch in Java8 oder in altem Java mit RetroLambda und dem Gradle-Plugin verwenden , dann haben Sie eine neue ausgefallene Syntax:
Wenn Sie DB-Abfragen ausführen müssen, können Sie, wie oben erwähnt, auf JINQ schauen, es kann jedoch nicht von RetroLambda zurückportiert werden, um serialisierte Lambdas zu verwenden.
quelle
Nur um eine weitere Alternative hinzuzufügen: Java 6 bietet eine Lösung für typsichere Datenbankabfragen mit dem Paket javax.persistence.criteria .
Obwohl ich sagen muss, dass dies nicht wirklich LINQ ist, weil Sie mit LINQ jede IEnumerable abfragen können.
quelle
Es gibt eine sehr gute Bibliothek, die Sie dafür verwenden können.
Befindet sich hier: https://github.com/nicholas22/jpropel-light
Lambdas werden jedoch erst in Java 8 verfügbar sein, daher ist die Verwendung etwas anders und fühlt sich nicht so natürlich an.
quelle
Es klingt so, als wäre der Linq, von dem hier alle sprechen, nur LinqToObjects. Was meiner Meinung nach nur Funktionen bietet, die bereits heute in Java ausgeführt werden können, aber mit wirklich hässlicher Syntax.
Was ich als die wahre Stärke von Linq in .Net sehe, ist, dass Lambda-Ausdrücke in einem Kontext verwendet werden können, der entweder einen Delegaten oder einen Ausdruck erfordert, und dann in die entsprechende Form kompiliert werden. Auf diese Weise können Dinge wie LinqToSql (oder etwas anderes als LinqToObjects) funktionieren und eine Syntax haben, die mit LinqToObjects identisch ist.
Es sieht so aus, als ob alle oben genannten Projekte nur die Funktionen von LinqToObjects bieten. Aus diesem Grund ist die Funktionalität vom Typ LinqToSql für Java nicht in Sicht.
quelle
Für grundlegende Funktionssammlungen ist Java 8 integriert, die meisten wichtigen Nicht-Java-JVM-Sprachen (Scala, Clojure usw.) und Sie können zusätzliche Bibliotheken für frühere Java-Versionen erhalten.
Für den vollsprachigen integrierten Zugriff auf eine SQL-Datenbank verfügt Scala (läuft auf der JVM) über Slick
quelle
Für LINQ (LINQ to Objects) hat Java 8 etwas Äquivalentes, siehe Project Lambda .
Es hat Enumerables LINQ to Objects-Erweiterungen wie Stuff . Aber für kompliziertere LINQ-Dinge wie Expression und ExpressionTree (diese werden für LINQ to SQL und andere LINQ-Anbieter benötigt, wenn sie etwas Optimiertes und Reales bereitstellen möchten) gibt es noch kein Äquivalent, aber vielleicht werden wir das in Zukunft sehen :)
Aber ich glaube nicht, dass es in Zukunft so etwas wie deklarative Abfragen unter Java geben wird.
quelle
In Java gibt es keine solche Funktion. Wenn Sie die andere API verwenden, erhalten Sie diese Funktion. Nehmen wir an, wir haben ein Tierobjekt, das Name und ID enthält. Wir haben Listenobjekte mit Tierobjekten. Wenn wir nun den gesamten Tiernamen, der 'o' enthält, vom Listenobjekt erhalten möchten. Wir können die folgende Abfrage schreiben
from(animals).where("getName", contains("o")).all();
Die obige Abfrageanweisung listet die Tiere auf, deren Name das 'o'-Alphabet enthält. Weitere Informationen finden Sie im folgenden Blog. http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
quelle
Schauen Sie sich tiny-q an . (Beachten Sie, dass Sie es derzeit nicht herunterladen können.)
Hier ist ein Beispiel, das den obigen Link angepasst hat:
quelle
JaQu ist das LINQ-Äquivalent für Java. Obwohl es für die H2-Datenbank entwickelt wurde, sollte es für jede Datenbank funktionieren, da es JDBC verwendet.
quelle
Vielleicht nicht die Antwort, auf die Sie hoffen, aber wenn ein Teil Ihres Codes umfangreiche Arbeiten an Sammlungen (Suchen, Sortieren, Filtern, Transformationen, Analysen) erfordert, können Sie in Betracht ziehen, einige Klassen in Clojure oder Scala zu schreiben .
Aufgrund ihrer funktionalen Natur ist die Arbeit mit Kollektionen das, was sie am besten können. Ich habe nicht viel Erfahrung mit Scala, aber mit Clojure finden Sie wahrscheinlich einen leistungsstärkeren Linq an Ihren Fingerspitzen. Nach dem Kompilieren lassen sich die von Ihnen erstellten Klassen nahtlos in den Rest der Codebasis integrieren.
quelle
Ein anonymer Benutzer erwähnte einen anderen, Diting :
quelle
Scala. Jetzt lese ich es und fand es wie linq, aber einfacher und unleserlicher. aber scala kann unter linux laufen, ja? csharp brauchen mono.
quelle
Es gab die Programmiersprache Pizza (eine Java-Erweiterung) und Sie sollten einen Blick darauf werfen. - Es verwendet das Konzept der "fließenden Schnittstellen", um Daten deklarativ abzufragen. Dies ist im Prinzip identisch mit LINQ ohne Abfrageausdrücke (http://en.wikipedia.org/wiki/Pizza_programming_language). Aber leider wurde es nicht weiterverfolgt, aber es wäre eine Möglichkeit gewesen, etwas Ähnliches wie LINQ in Java zu bringen.
quelle
Es gibt kein Äquivalent zu LINQ für Java. Es gibt jedoch einige externe APIs, die wie LINQ aussehen, z. B. https://github.com/nicholas22/jpropel-light , https://code.google.com/p/jaque/
quelle
Sie können diese Bibliothek ausprobieren: https://code.google.com/p/qood/
Hier sind einige Gründe, es zu verwenden:
quelle