LINQ的Java等价物是什么?


当前回答

也许不是你所希望的答案,但如果你的代码的某些部分需要在集合上做大量工作(搜索、排序、过滤、转换、分析),你可以考虑用Clojure或Scala编写一些类。

由于其功能性,使用集合是他们最擅长的。我对Scala没有太多经验,但使用Clojure,您可能会发现一个更强大的Linq,一旦编译,您将生成的类将与其他代码库无缝集成。

其他回答

有一个非常好的图书馆,你可以用来做这个。

位于此处:https://github.com/nicholas22/jpropel-light

Lambdas要到Java8才能使用,所以使用它有点不同,感觉不太自然。

既然Java8支持lambdas,就可以创建与LINQ非常相似的JavaAPI了。

Jinq是这些新的LINQ风格的Java库之一。

我是这个库的开发人员。它基于五年来使用字节码分析将Java转换为数据库查询的研究。类似于C#的D-LINQ是一个位于实体框架之上的查询层,Jinq能够充当JPA或jOOQ之上的一个查询层。它支持聚合、组和子查询。就连埃里克·梅杰(LINQ的创始人)也承认了金克。

只需添加另一个备选方案:Java6确实有一个使用javax.persistence.ccriteria包的类型安全数据库查询解决方案。

尽管我必须说,这不是真正的LINQ,因为使用LINQ可以查询任何IEnumerable。

你可以试试我的图书馆CollectionsQuery。它允许在对象集合上运行类似LINQ的查询。您必须传递谓词,就像在LINQ中一样。如果您使用的是java6/7,则必须对接口使用旧语法:

List<String> names = Queryable.from(people)
                                    .filter(new Predicate<Person>() {
                                                public boolean filter(Person p) {
                                                    return p.age>20;
                                                }
                                            })
                                    .map   (new Converter<Person,String>() {
                                                public Integer convert(Person p) {
                                                    return p.name;
                                                }
                                            })
                                    .toList();

您也可以在Java8中使用它,或者在带有RetroLambda和它的gradle插件的旧java中使用它。然后您将拥有新的花式语法:

List<String> names = Queryable.from(people)
                                    .filter(p->p.age>20)
                                    .map   (p->p.name)
                                    .toList();

如果您需要运行DB查询,那么可以查看JINQ,如上所述,但RetroLambda无法对其进行反向移植,因此无法使用序列化的Lambda。

对于Java来说,并不是真正的“Linq to SQL”。但有点接近。查询DSL