Parsen und Übersetzen von Java 8 Lambda-Ausdrücken

c# expression-trees java java-8 lambda

Frage

In C # können Sie einen Lambda-Ausdruck in ein Ausdrucksbaumobjekt einschließen und dann möglicherweise analysieren . Ich habe mich gefragt, ob das auch in Java möglich ist.

Was ich suche, ist etwas in der Art:

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

Und dann sollte das BooksRepository diese Abfrage irgendwie in die folgende RESTful-API-Anfrage übersetzen, basierend auf den Prädikaten, die als lambdas angegeben sind:

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

und dann das Ergebnis an den Client zurückgeben. Irgendeine Idee, wenn das überhaupt in Java möglich ist?

Akzeptierte Antwort

Ja es ist möglich. Ich habe eine Bibliothek gemacht, die genau das macht: JaQue


Beliebte Antwort

Ich bin der Autor von Jinq . Die automatische Konvertierung von Lambdas in Ausdrucksbäume, die zur Laufzeit gelesen werden können, ist nur eine C # -Funktion. Diese Funktion hat keinen normalen Zweck für normale Programmierer. Es ist im Grunde nur nützlich für die Implementierung von LINQ, sodass Sprachentwickler nicht daran interessiert waren, diese Funktion zu Java oder anderen Sprachen hinzuzufügen. Es ist die Rede davon gewesen, eine Art Compiler-Plugin-Framework für Java hinzuzufügen, mit dem Sie das Expression-Tree-Feature selbst zu Java hinzufügen könnten, aber ich bin mit dem Fortschritt in diesem Projekt nicht so vertraut.

Jinq enthält ein Bytecode-Analyse-Framework, das zur Laufzeit einfache Ausdrucksbäume aus dem Bytecode eines Lambda erzeugen kann. Es basiert auf symbolischer Ausführung und ASM. Es kann verwendet werden, um lambdas in Ausdrucksbäume umzuwandeln, genau wie C #, aber es ist ein ziemlich schweres Verfahren mit vielen Ringen, durch die man springen kann, also könnte es für das, was Sie tun wollen, übertrieben sein. Du würdest im Grunde eine Fliege mit einem Hammer schlagen.

Es gibt andere Sprachen als Java, die auf der JVM ausgeführt werden und eine bessere Unterstützung für die Metaprogrammierung bieten, die Sie ausführen möchten. Sie sollten also auch einen Blick auf Groovy oder Scala werfen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum