解析和翻译Java8Lambda表达式

解析和翻译Java8Lambda表达式,java,c#,lambda,java-8,expression-trees,Java,C#,Lambda,Java 8,Expression Trees,在C#中,可以将lambda表达式括在表达式树对象中,然后可能。我想知道在Java中是否也可以这样做 我想做的是这样的事情: BooksRepository.getAll() .where(b -> b.getIban() == "SomeIban") .and(b -> b.getAuthor() == "SomeAuthor"); //etc. 然后,BooksRepository应该基于指定为lambdas的谓词,以某种方式将该查询转换为以下RESTful API请求: GE

在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中是否可行吗?

类似的东西

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

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


在JVM上运行的Java以外的其他语言对您想要执行的元编程有更好的支持。所以你也可以考虑看Groovy或斯卡拉。

< P>我解释我在这里的方法


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

是的,这是可能的。我创建了一个库,它正好做到了这一点:

这是一个崇高的目标,但lambdas根本帮不了你。Java中没有可比的东西。编写
.where(b->b.getIban()==“SomeIban”)
而不是
where IBAN='SomeIban'
(作为SQL语句的一部分)有什么好处?如果它可以翻译任意Java代码,那么它将非常强大,但相应的C#功能仅限于简单的表达式,因此它会在开始有用的地方停止…@Holger优点是避免不透明、非语法检查的字符串。但我更喜欢jOOQ,因为通过这种方法,您可以在Java对象中表示SQL的可重用部分。另一方面,这种方法是特定于SQL的,而不是OP在这里提出的问题。@Holger重构、编译时间检查、自动完成和底层查询实现的抽象。@Holger同意,特别是你在第一句中的观点。lambda可以是任何东西,只有运行时才会给您带来错误。更糟糕的是,运行时似乎将“无缝地”恢复到JVM处理中。没错!见主要问题下的评论。你好,明博士。你说的完全正确,如果这是我唯一的要求,那么我会“用锤子打苍蝇”,但事实并非如此。事实上,我在问题中给出的示例只是一个简单的用例,它是我想到的许多其他东西的一个简单用例,因为我们正在向java 8迈进,从双向对象映射(ala automapper)、验证规则(ala fluent validation.net)到工作流DSL,以及抽象的RESTful查询。哦,顺便说一句,我读过你关于符号执行的文章,并且一直(试图)理解jinq的分析包(顺便说一句,这是一个非常令人印象深刻的工作),但是对于我这个java世界的新手来说,这是一个相当大的挑战。你有Jinq分析包的文档吗?如果你只做简单的查询,那么设计一个不需要lambdas作为输入的简单API就会容易得多。如果你有关于Jinq的具体问题,直接发电子邮件给我可能更容易。没有分析包的文档。您可以通过查看jinq jpa/main/org/jinq/jpa/transform/LambdaInfo.java文件来了解它是如何使用的。C#确实有一些很棒的特性。微软的设计理念是在C#中快速添加新功能,而不必太担心打破旧功能。Java发展缓慢,在这样做之前要等待普遍的共识。经验表明,Linq表达式对于构建查询系统非常有用,就像您的系统一样。但是它们对其他事情有用吗?为什么它们只限于表达?为什么不提供一个更强大的元编程功能,它也可以与语句一起使用?这就是为什么Java还没有这个特性的原因。Java提供了注释作为一种笨拙的选择。伙计,你应该冷静一点。我不明白你为什么对编程语言设计这样深奥的东西如此激动。我有时自己用C#编写代码。当我说C#“行动迅速,打破现状”时,我的意思是作为一种恭维,但由于评论中的人物限制,我无法详细阐述。这是硅谷的方式。人们经常称赞苹果公司不喜欢旧的API。快速移动的自然结果是一些东西断裂。Java的发展很慢,但有时太慢了。C#使用了一套与Java不同的权衡方法。没有一种语言是完美的。冷静点,伙计。这太了不起了,我真的很难过看到这个项目很少受到关注,似乎被放弃了。LINQ是一回事,但我认为表达式是C#和.NET最强大的功能之一,而且执行类型安全、流畅的配置的能力非常强大和富有表现力。@AviCherry:谢谢你的评论。如果你认为这个项目很重要,你可以在这里和右边的一些相关问题中投票。希望它能使它更明显。顺便说一句,它没有死。我只是没有任何打开的项目;-)。毕竟,这是一个拥有
database.customerStream().where(customer -> customer.getName().equals("Alice"));