Java中与LINQ等效的是什么?

871

Java中与LINQ相当的是什么?


4
看起来这些是LINQ to SQL。 - SLaks
8
请查看此链接:github.com/nicholas22/jpropel-light。以下是一个真实的例子:new String[] { "james", "john", "john", "eddie" }.where(startsWith("j")).toList().distinct(); 该代码的作用是从包含四个字符串的字符串数组中,选择以字母 "j" 开头并去重后返回列表形式。 - NT_
1
Java开发者仍然使用多个语句和foreach循环,这可以通过Linq来解决... - om471987
1
同时,对于带有完整LINQ API的Scala:https://github.com/nicholas22/propelS - Scooterville
5
作为一个现在主要困在Java世界但是之前使用.NET的人,我理解你的感受。不过你应该试试Scala——它拥有一流的函数/闭包、for推导式(虽然和LINQ查询语法不完全一样,但在很多情况下很有用)、统一类型系统、类型推断、一些方便处理泛型类型擦除的方法……所有这些都在JVM上运行,并与Java相互操作。此外,还有很多其他函数式编程特性,如模式匹配、Option类型等。 - Tim Goodman
显示剩余4条评论
34个回答

843

Java中没有像LINQ这样的东西。

...

编辑

现在有了Java 8,我们引入了Stream API,它在处理集合时类似于LINQ,但并不完全相同。

如果你正在寻找像Entity Framework这样的ORM,则可以尝试Hibernate

:-)


9
计划中有什么内容吗?已融入语言吗?有JCP编号吗?等等。 - Cheeso
6
非常正确,LINQ 如此美妙的一个重要因素是它深度融合在语言和编译器中。 - AgileJon
11
抱歉,“非常正确”是针对280Z28的。我不知道是否有适用于它的JCP。由于LINQ需要对C#语言进行若干更改,考虑到JCP工作的速度,我不会抱有太大期望。 - AgileJon
12
这并不正确。请参考:https://dev59.com/N2gv5IYBdhLWcg3wDsnZ#10879784 - Scooterville
25
LINQ是一种规范,而不是实现方式。Lambda表达式是LINQ的一部分。所有试图将LINQ移植到Java的项目都是为具体场景(SQL、对象等)提供的实现,但并没有涵盖LINQ的主要目标:在代码中集成语言查询。因此,目前还没有真正的替代方案或倡议可以被视为替代品。 - sesispla
显示剩余11条评论

156

这里有一个备选方案,Coollection

Coollection并不试图成为新的Lambda,但我们被古老的Java项目包围,这个库会很有帮助。它非常简单易用,可以扩展,覆盖了迭代集合中最常用的操作,例如:

from(people).where("name", eq("Arthur")).first();
from(people).where("age", lessThan(20)).all();
from(people).where("name", not(contains("Francine"))).all();

7
列名称的字符串,这意味着编译器和集成开发环境无法帮助避免拼写错误,并且重构困难。有任何改变的计划吗? - Liz Av
2
嗨,Ekevoo。我认为这将是很棒的,我曾经尝试过做到这一点。但是目前,使用Java 8,Coollection是一个已弃用的库。也许对于旧项目有用...你觉得呢? - 19WAS85
1
@WagnerAndrade 最后一次提交是5-6年前。我猜这个功能大部分被Java 8所取代了?另外,非常酷的名字 :) - Honinbo Shusaku

148

Java 8中现在可以使用JSR-335 - Lambda Expressions for the JavaTM Programming Language的形式使用Lambdas。您需要阅读Brian Goetz的文章以了解JDK8中如何实现Lambda,同时还需了解流、内部迭代、短路和构造函数引用。此外,请查看上述JSR以获取更多示例。

更新JDK8已发布,其中包含项目lambda。值得一提的是,Java 8 in Action目前仍然是MEAP版本,建议下载。

我写了一篇关于在JDK8中使用lambda表达式的一些优点的博客,名为箭头的力量,此外NetBeans 8具有将结构转换为JDK8的强大支持,我也在博客中介绍了使用NetBeans迁移到JDK 8


Lambda表达式不也计划在Java 7中发布吗?发生了什么事? - BlueRaja - Danny Pflughoeft
7
甲骨文收购了Sun(带点儿玩笑)。Java 7耗时太长(5年),因此Lambda表达式错过了入围名单,这让人们感到相当失望。尽管如此,甲骨文看起来正在接过这个球,我认为我们计划于明年十月推出Java 8。 - Brett Ryan
1
请注意,Lambda状态报告已再次更新,现在涵盖了流、内部迭代、短路和构造函数引用。我建议大家阅读这份新文档。 - Brett Ryan
请注意:发行版本已经推迟至2014年3月,原因已在jdk8-dev邮件列表中详细说明,并在Mark Reinhold的博客上进行了更广泛的阐述。 - Brett Ryan
7
Lambda表达式是LINQ的一个小部分。 - sesispla
4
如果你指的是C#中的查询语言,那么是的,在Java中不会有类似的东西。但是根据我的经验,大多数经验丰富的C#开发人员更喜欢lambda表达式而不是查询语言。但是,如果你指的是LINQ-to-Entities,那么你会发现在Java中使用lambda表达式可以实现这个功能甚至更多。Java 8中还有很多新功能来支持这种开发,例如默认方法 - Brett Ryan

119

通过使用lambdaj库,您可以以更易读的方式选择集合中的项目(以及更多内容)

https://code.google.com/archive/p/lambdaj/

与Quaere库相比,它具有一些优点,因为它不使用任何魔术字符串,完全类型安全,而且在我看来提供了更易读的DSL。


6
这很好,但距离能够构建并执行关于sql、xml、集合等的查询还有很大差距。 - bytebender
当我在我的Android项目中使用lambdaj选择自定义类时,为什么会出现java.lang.ExceptionInInitializerError? - topwik
1
+1 这对于我们这些不关心 SQL/XML,只想更轻松地访问集合的人来说真的很好。 - ashes999

107

如果你想找到与LINQ相当的内容,除非使用javacc创建自己的等效内容,否则无法找到。

在有人发现可行的方法之前,有一些很好的替代方案,例如:


在github.com/TrigerSoft/jaque中发现了这种方式,让我们创建表达式树。结合Java 8 Lambdas,任何LINQ功能都可以像在.Net中一样轻松实现。 - Konstantin Triger
请参考此答案进行比较:https://dev59.com/ll8e5IYBdhLWcg3wLYHt - Konstantin Triger

50
LINQ to Objects - JAVA 8新增了Stream API,它支持对值流进行函数式操作: 包java.util.stream Java 8 Explained: Applying Lambdas to Java Collections LINQ to SQL/NHibernate/etc. (数据库查询) - 一种选择是使用JINQ,它也使用新的JAVA 8功能,并于2014年2月26日在Github上发布: https://github.com/my2iu/Jinq
  

Jinq为开发人员提供了一种简单而自然的方式来编写Java中的数据库查询。您可以像处理存储在集合中的普通Java对象一样处理数据库数据。您可以使用正常的Java命令迭代和过滤它们,所有代码都将自动转换为优化的数据库查询。最后,Java可用的LINQ风格查询!

JINQ项目网站: http://www.jinq.org/

不确定为什么读者们没有注意到你的答案,即使Stream API是最接近LINQ的! - Rafid
4
与LINQ相比,Streams API 简直是个笑话。 - Andrei Rînea
2
抱歉,兄弟,我不是有意冒犯。在尝试使用流API后,我正在寻找一个LINQ等效的方法。我只是想说这并不是真正的等效方法,仅此而已。 - Andrei Rînea
1
@AndreiRînea 你是在寻找与 LINQ 提供程序 (LINQ to XML、LINQ to JSON、LINQ to NHibernate 等) 相当的功能吗? - Răzvan Flavius Panda
2
我所需要的只是对集合进行分组和最大化的方法。最终我成功了,但付出了很多努力和过多的代码。 - Andrei Rînea

29

有一个名为 quaere 的项目。

它是一个Java框架,可以使集合具备查询的能力。

注:根据作者的说法,该项目已不再维护。


2
Quaere看起来提供了LINQ提供的一些功能,但问题是要找到一个“等效”的替代方案。 - AgileJon
6
所以这个东西有点像LINQ,如果不是直接等价的话?至少听起来很有帮助。 - Brian Agnew
3
如果他真的是指"等效的",他本来就不需要问。他可以输入from x in xs select x来找到答案(不行)。 - kizzx2

17

Java有许多与LINQ相当的等效物,可以查看这里进行比较。

如果需要类型安全的Quaere/LINQ风格框架,请考虑使用Querydsl。 Querydsl支持JPA/Hibernate、JDO、SQL和Java Collections。

我是Querydsl的维护者,因此这个回答有偏见。


7
“类似框架”链接已失效。你是否还有相应的页面? - Lukas Eder
我们何时才能有一本QueryDSL的书?或者是价格合理的培训选项?您提供的支持链接无法打开。 - kervin
queryDsl有多少人在工作? - mattsmith5

16

你可以使用Scala,它的语法与LINQ相似,并且实际上可能比LINQ更强大。


1
特别是Scala的“for comprehensions”。 - Nico

10

现在 Java 8 支持 Lambda 表达式,这使得可以创建类似于 LINQ 的 Java API。

Jinq 是其中一种新的类 LINQ 库,用于 Java。

我是这个库的开发人员。它基于五年的研究,使用字节码分析将 Java 转换为数据库查询。类似于 C# 的 D-LINQ 是一个查询层,位于 Entity Framework 之上,Jinq 可以作为一个查询层,位于 JPA 或 JOOQ 之上。它支持聚合、分组和子查询。甚至 Erik Meijer(LINQ 的创造者)也已经 承认了 Jinq


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接