【发布时间】:2014-09-23 07:34:05
【问题描述】:
在 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 中是否可行?
【问题讨论】:
-
这是一个崇高的目标,但 lambdas 根本无法帮助您。 Java 中没有可比的。
-
写
.where(b -> b.getIban() == "SomeIban")而不是WHERE IBAN = 'SomeIban'(作为SQL语句的一部分)有什么好处?如果它可以翻译任意 Java 代码,它会很强大,但相应的 C# 功能仅限于简单的表达式,因此它会在可能开始变得有用的地方停止…… -
@Holger 优点是避免了不透明的、非语法检查的字符串。但我更喜欢 jOOQ,因为通过这种方法,您可以在 Java 对象中表示 SQL 的 可重用 部分。另一方面,这种方法是特定于 SQL 的,而不是 OP 在这里询问的内容。
-
@Holger 重构、编译时间检查、自动完成和底层查询实现的抽象。
-
@Holger 同意,尤其是您在第一句话中的观点。 lambda 可以是任何东西,只有运行时会报错。更糟糕的是,运行时似乎将“无缝”恢复到 JVM 内处理。 Y-U-C-K。
标签: java c# lambda java-8 expression-trees