解析和转换 Java 8 lambda 表达式

2022-09-02 21:17:37

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

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

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

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

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

,然后将结果返回给客户端。任何想法,如果这在Java中是可能的?


答案 1

是的,这是可能的。我制作了一个完全做到这一点的库:JaQue


答案 2

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

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

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


推荐