解析和翻译Java 8 lambda表达式

在C#中,您可以将lambda表达式包含在表达式树对象中,然后可能会对其进行解析 。 我想知道这是否也可以用Java?

我正在寻找的是做这样的事情:

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

然后BooksRepository应该以某种方式将该查询转换为基于指定为lambdas的谓词的以下RESTful API请求:

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

然后将结果返回给客户端。 如果在Java中甚至可以实现这一点?

是的,这是可能的。 我创建了一个完全相同的库: JaQue

我是Jinq的作者。 lambdas自动转换为可在运行时读取的表达式树是C#唯一的function。 该function对于普通程序员来说并没有任何通用用途。 它基本上只对实现LINQ有用,因此语言设计人员并不热衷于将该function添加到Java或其他语言中。 有人谈到为Java添加某种编译器插件框架,允许你自己将表达式树特性添加到Java中,但我不太熟悉该项目的进展。

Jinq包含一个字节码分析框架,可以在运行时从lambda的字节码构建简单的表达式树。 它基于符号执行和ASM。 它可以用来将lambda转换为表达式树,就像C#一样,但是它的重量很重,有很多箍要跳过,所以对你想做的事情来说可能有些过分。 你基本上是用锤子打一只苍蝇。

在JVM上运行的Java以外的语言可以更好地支持您想要执行的元编程。 因此,您可能还需要考虑查看Groovy或Scala。

像Jinq这样的东西 ?

 database.customerStream().where(customer -> customer.getName().equals("Alice")); 

我在这里解释我的方法http://benjiweber.co.uk/blog/2013/12/28/typesafe-database-interaction-with-java-8/

基本上,将lambda重放为在运行时记录交互的伪对象。