Y a-t-il des bibliothèques en Java qui sont près de fournir les fonctionnalités de Linq?
Y a-t-il des bibliothèques en Java qui sont près de fournir les fonctionnalités de Linq?
Réponses:
Pour obtenir la syntaxe de requête LINQ complète, vous auriez besoin d'une mise à jour des spécifications de langue et des compilateurs prenant en charge les nouveaux mots clés et la nouvelle structure de syntaxe. C'est bien au-delà de la plupart des lecteurs ici.
Afin d'obtenir une syntaxe de chaîne de méthodes de type Linq en Java qui ressemble et fonctionne comme ce qui est en C #, vous avez besoin de deux choses que Java ne prend pas en charge; les méthodes d'extension (méthodes statiques qui peuvent être appliquées à une instance comme s'il s'agissait d'une méthode d'instance) et les expressions lambda (délégués anonymes). Cependant, ces deux peuvent être usurpés avec des constructions Java existantes, si vous êtes prêt à encourir un peu de verbosité de codage supplémentaire. Une chose que je trouve particulièrement étonnante à propos de Java est la possibilité de créer des implémentations d'interfaces anonymes; appliqué à une interface avec une seule fonction pure, qui permet essentiellement de simples délégués anonymes, à condition que vous ayez une interface pour chaque signature de méthode dont vous aurez besoin.
Ainsi, le côté IEnumerable (Iterable pour les Javaheads) de Linq, en tant que chaîne de méthode, devrait être possible d'approximer en Java; vous l'implémenteriez essentiellement comme une interface fluide qui contrôle une monade. Vous auriez besoin d'une classe comme a LinqIterable
, implémentant Iterable, qui:
Ainsi, vous pourriez probablement définir une bibliothèque "fluide" qui permettrait une déclaration telle que:
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;}});
La création de la bibliothèque proprement dite est un exercice bien au-delà de la portée d'une réponse sur un Q&A Internet. Je viens de dire que c'était possible, pas facile.
Les arbres d'expression ne sont pas sorciers, mais ce serait un projet important de mettre en œuvre ce que .NET a dans ce domaine; non seulement vous avez besoin de pouvoir construire une arborescence d'expressions, mais vous devez aussi pouvoir "compiler" cette arborescence à la volée en utilisant des bytecodes émis; Je ne sais pas si la réflexion de Java est si puissante.
Voir:
Non. Linq nécessite de nombreuses fonctionnalités de langage que Java vient de posséder
Utilisez Scala , pour les raisons expliquées ici :
utilisez le port .NET de Scala. Il vous donne un accès natif complet à tout dans .NET, qui inclut évidemment LINQ.
Si vous ne le pouvez pas, vous pouvez essayer d'utiliser des bibliothèques comme functionjava ou lambdaj , mais vous ne serez pas vraiment proche de LINQ.
J'ajouterais de la goyave à la liste des bibliothèques qui peuvent vous aider à réaliser certaines des choses que LINQ fait.
Mais comme d'autres l'ont souligné, il n'y a pas d'équivalent en Java pur.
Vous pouvez utiliser Korma , une DSL pour les requêtes SQL écrites en Clojure.
La syntaxe est assez soignée:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
Vous pouvez appeler cela assez facilement à partir de Java en important les bibliothèques Clojure pertinentes et en utilisant simplement l'interopérabilité Clojure / Java normale.
Il n'y a pas de fonctionnalité native en java qui imite linq. Cependant, il existe plusieurs API qui offrent la même fonctionnalité.
Par exemple, ce billet de blog a un pot personnalisé pour répliquer linq.
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
Et ceci est un exemple d'utilisation de l'API de la publication:
Supposons que nous ayons un objet Animal contenant le nom et l'ID qui est représenté par une liste de animals
. Si nous voulons obtenir tous les noms d'animaux qui contiennent «o» dans la liste animals
, nous pouvons écrire la requête suivante
from(animals).where("getName", contains("o")).all();
Il y a deux autres API référencées dans la publication du blog: lambdaJ et jLinq
where("getName", ...)
.