Gibt es Bibliotheken in Java, die der Funktionalität von Linq nahekommen?
Gibt es Bibliotheken in Java, die der Funktionalität von Linq nahekommen?
Antworten:
Um die vollständige LINQ-Abfragesyntax zu erhalten, müssen Sie die Sprachspezifikation und die Compiler aktualisieren, die die neuen Schlüsselwörter und die Syntaxstruktur unterstützen. Dies ist weit jenseits der meisten Leser hier.
Um eine Linq-ähnliche Methodenkettensyntax in Java zu erhalten, die wie C # aussieht und funktioniert, benötigen Sie zwei Dinge, die Java nicht unterstützt. Erweiterungsmethoden (statische Methoden, die wie eine Instanzmethode auf eine Instanz angewendet werden können) und Lambda-Ausdrücke (anonyme Delegaten). Diese beiden können jedoch mit vorhandenen Java-Konstrukten gefälscht werden, wenn Sie bereit sind, ein wenig zusätzliche Programmier-Ausführlichkeit in Kauf zu nehmen. Eine Sache, die ich an Java besonders verblüffend finde, ist die Möglichkeit, anonyme Schnittstellenimplementierungen zu erstellen. Wird auf eine Schnittstelle mit einer einzigen reinen Funktion angewendet, die im Grunde genommen einfache anonyme Delegaten ermöglicht, vorausgesetzt, Sie haben eine Schnittstelle für jede Methodensignatur, die Sie benötigen.
Daher sollte es möglich sein, die IEnumerable-Seite (Iterable für die Javaheads) von Linq als Methodenkette in Java zu approximieren. Sie würden es im Grunde als flüssige Schnittstelle implementieren, die eine Monade steuert. Sie benötigen eine Klasse wie eine LinqIterable
, die Iterable implementiert:
Sie könnten also wahrscheinlich eine "fließende" Bibliothek definieren, die eine Aussage wie die folgende zulässt:
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;}});
Die Erstellung der eigentlichen Bibliothek ist eine Übung, die weit über die Beantwortung von Fragen und Antworten im Internet hinausgeht. Ich habe nur gesagt, dass es möglich ist, nicht einfach.
Ausdrucksbäume sind keine Hexenwerkzeuge, aber es wäre ein bedeutendes Projekt, das zu implementieren, was .NET in diesem Bereich hat. Sie brauchen nicht nur die Fähigkeit, einen Ausdrucksbaum zu erstellen, sondern Sie müssen in der Lage sein, diesen Baum im laufenden Betrieb unter Verwendung der ausgegebenen Bytecodes zu "kompilieren". Ich weiß nicht, ob Javas Spiegelbild so mächtig ist.
Sehen:
Nein. Linq benötigt viele Sprachfunktionen, über die Java nur verfügt
Verwenden Sie Scala aus folgenden Gründen :
benutze den .NET Port von Scala. Es gibt Ihnen vollen nativen Zugriff auf alles in .NET, wozu natürlich auch LINQ gehört.
Wenn Sie dies nicht können, können Sie versuchen, Bibliotheken wie functionjava oder lambdaj zu verwenden , aber Sie werden LINQ nicht wirklich nahe kommen.
Ich würde der Liste der Bibliotheken eine Guave hinzufügen , die Ihnen dabei helfen kann, einige der Aufgaben von LINQ zu erfüllen.
Aber wie andere betont haben, gibt es in reinem Java kein Äquivalent.
Sie könnten Korma verwenden , ein DSL für SQL-Abfragen, das in Clojure geschrieben wurde.
Syntax ist ziemlich ordentlich:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
Sie können dies ziemlich einfach von Java aus aufrufen, indem Sie die entsprechenden Clojure-Bibliotheken importieren und einfach das normale Clojure / Java-Interop verwenden.
In Java gibt es kein natives Feature, das Linq nachahmt. Es gibt jedoch mehrere APIs, die dieselbe Funktionalität bereitstellen.
Dieser Blog-Beitrag enthält beispielsweise eine benutzerdefinierte JAR-Datei zum Replizieren von Linq.
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
Und dies ist ein Beispiel für die Verwendung der API aus dem Beitrag:
Angenommen, wir haben ein Animal-Objekt mit Namen und ID, das mit einer Liste von dargestellt wird animals
. Wenn wir alle Tiernamen, die 'o' enthalten, aus der Liste erhalten möchten animals
, können wir die folgende Abfrage schreiben
from(animals).where("getName", contains("o")).all();
Es gibt zwei weitere APIs, auf die im Blogeintrag verwiesen wird : lambdaJ und jLinq
where("getName", ...)
.