解析和翻译Java 8 lambda表达式

时间:2014-09-23 07:34:05

标签: java c# lambda java-8 expression-trees

在C#中,您可以将lambda表达式括在表达式树对象中,然后可能parse it。我想知道这在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中甚至可以实现这一点?

4 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:4)

类似于Jinq

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

答案 3 :(得分:2)

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

基本上,针对在运行时记录交互的假对象重放lambda。