Analyse et traduction d'expressions lambda Java 8

c# expression-trees java java-8 lambda

Question

En C #, vous pouvez inclure une expression lambda dans un objet d’arbre d’expression et éventuellement l’ analyser . Je me demandais si cela était aussi possible en Java?

Ce que je recherche, c'est quelque chose comme ça:

BooksRepository.getAll()
.where(b -> b.getIban() == "SomeIban")
.and(b -> b.getAuthor() == "SomeAuthor"); //etc.

Ensuite, BooksRepository doit en quelque sorte traduire cette requête en requête API RESTful suivante, basée sur les prédicats spécifiés en tant que lambdas:

GET http://mylibrary.com/books?Iban=SomeIban&Author=SomeAuthor

puis renvoyez le résultat au client. Une idée si cela est même possible en Java?

Réponse acceptée

Oui c'est possible. J'ai créé une bibliothèque qui fait exactement cela: JaQue


Réponse populaire

Je suis l'auteur de Jinq . Les conversions automatiques de lambdas en arborescences d'expression lisibles à l'exécution sont une fonctionnalité uniquement en C #. Cette fonctionnalité n’a pas vraiment d’utilisation générale pour les programmeurs normaux. En principe, il n’est utile que pour implémenter LINQ. Les concepteurs de langages n’ont donc pas tenu à ajouter cette fonctionnalité à Java ou à d’autres langages. Il a été question d’ajouter une sorte de framework de plug-in de compilateur pour Java qui vous permettrait d’ajouter vous-même la fonctionnalité d’arbre des expressions à Java, mais je ne connais pas très bien les progrès de ce projet.

Jinq contient un framework d’analyse de bytecode permettant de construire de simples arbres d’expression à partir du bytecode d’un lambda lors de l’exécution. Il est basé sur une exécution symbolique et ASM. Il peut être utilisé pour convertir des lambdas en arbres d’expression, tout comme le C #, mais c’est une procédure assez lourde avec beaucoup d’arcs à traverser, ce qui peut être excessif pour ce que vous voulez faire. Vous seriez en train d'écraser une mouche avec un marteau.

Il existe des langages autres que Java exécutés sur la machine virtuelle qui prennent mieux en charge la métaprogrammation que vous souhaitez effectuer. Vous voudrez peut-être aussi envisager de regarder Groovy ou Scala pour cela.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi