Analisi e traduzione di espressioni lambda Java 8

c# expression-trees java java-8 lambda

Domanda

In C # è possibile racchiudere un'espressione lambda in un oggetto tree dell'espressione e quindi eventualmente analizzarlo . Mi stavo chiedendo se questo è possibile anche in Java?

Quello che sto cercando è qualcosa di simile a questo:

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

E quindi il BooksRepository dovrebbe in qualche modo tradurre quella query alla seguente richiesta API RESTful in base ai predicati specificati come lambdas:

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

e quindi restituire il risultato al cliente. Qualche idea se questo sia persino possibile in Java?

Risposta accettata

Si è possibile. Ho creato una libreria che fa esattamente questo: JaQue


Risposta popolare

Sono l'autore di Jinq . Le conversioni automatiche di lambda negli alberi di espressione che possono essere letti in fase di runtime sono una caratteristica C #. Quella caratteristica non ha un uso generico per i normali programmatori. Fondamentalmente è utile solo per implementare LINQ, quindi i progettisti di linguaggi non sono stati entusiasti di aggiungere tale funzionalità a Java o ad altre lingue. Si è parlato di aggiungere una sorta di framework di plugin per compilatori per Java che ti consentirebbe di aggiungere la funzione di albero delle espressioni a Java tu stesso, ma non ho molta familiarità con i progressi su quel progetto.

Jinq contiene un quadro di analisi bytecode che può costruire alberi di espressioni semplici dal bytecode di un lambda in fase di esecuzione. Si basa sull'esecuzione simbolica e ASM. Può essere usato per convertire lambda in alberi di espressione, proprio come C #, ma è una procedura piuttosto pesante con un sacco di cerchi da saltare, quindi potrebbe essere eccessivo per quello che vuoi fare. Avresti schiacciato una mosca con un martello, essenzialmente.

Esistono lingue diverse da Java eseguite sulla JVM che offrono un supporto migliore per la metaprogrammazione che si desidera eseguire. Quindi potresti anche considerare di guardare Groovy o Scala per quello.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché