在 C# 中,您可以将 lambda 表达式包含在表达式树对象中,然后可能解析它。我想知道这在Java中是否也可行?
我正在寻找做这样的事情:
BooksRepository.getAll()
.where(b -> b.getIban() == "SomeIban")
.and(b -> b.getAuthor() == "SomeAuthor"); //etc.
然后
BooksRepository
应以某种方式根据指定为 lambda 的谓词将该查询转换为以下 RESTful API 请求:
GET http://mylibrary.com/books?Iban=SomeIban&Author=SomeAuthor
然后将结果返回给客户端。知道这在 Java 中是否可能吗?
是的,这是可能的。我创建了一个库来实现这一点:ExTree
我是Jinq的作者。将 lambda 自动转换为可在运行时读取的表达式树是 C# 独有的功能。对于普通程序员来说,该功能实际上没有任何通用用途。它基本上只对实现 LINQ 有用,因此语言设计者并不热衷于将该功能添加到 Java 或其他语言中。有人讨论过为 Java 添加某种编译器插件框架,这样您就可以自己将表达式树功能添加到 Java 中,但我不太熟悉该项目的进展。
Jinq 包含一个字节码分析框架,可以在运行时从 lambda 的字节码构建简单的表达式树。它基于符号执行和 ASM。它可用于将 lambda 表达式转换为表达式树,就像 C# 一样,但它是一个相当重量级的过程,需要跳过很多环节,因此对于您想要做的事情来说,它可能有点矫枉过正。本质上,你就像用锤子拍苍蝇一样。
除了 Java 之外,还有一些在 JVM 上运行的语言可以更好地支持您想要执行的元编程。因此,您可能还需要考虑使用 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。