开始用 C# 学习 LINQ。
尤其是 LINQ to Objects 和 LINQ to XML。
我真的很喜欢 LINQ 的强大功能。
我了解到有一种叫做JLINQ的 JavaScript 实现。
此外(正如 Catbert 发布的)Scala 将具有LINQ
你知道 LINQ 或类似的东西是否会成为 Java 7 的一部分吗?
更新:2008 年的有趣帖子 - LINQ for Java 工具
看看Scala,它是一种强大的函数式编程语言,但与 Java 类似,运行在 Java 平台上。
在 Scala 中,可以使用与 LINQ 中基本相同的代码结构,尽管在 C# 或 VB 中没有特殊的查询理解语法。
编辑 :
以下是 Scala 查询功能的示例:
// Get all StackOverflow users with more than 20,000 reputation points.
val topUsers = for{
u <- users
if u.reputation > 20000
} yield u;
println ("Users with more than 20,000 reputation:")
for (u <- topUsers) {
println u.name
}
重要的是要注意 LINQ 有四件事:
刚听说过的人可能会认为它只是数据库集成。使用过它的人可能会想到类似 SQL 的语法。那些真正深入研究的人会意识到它的一元理解方面,即使他们不知道它是什么。
以 Scala 为例,它具有一元理解,而没有其他三个。有一个名为ScalaQuery的库,它通过单子理解提供数据库集成(这样做的内在能力是单子很酷的主要原因)。我认为另一个名为ScalaQL的项目打算提供几乎相同的东西,但使用编译器插件来增强它。我不知道你提到的 Miguel Garcia 的工作,但是,看到他完成的其他工作,我很兴奋。
然而,一个人不需要特殊的语法来进行单子理解。它只是使它不受样板的影响。因此,具有适当泛型支持级别的语言可以立即使用它的这一方面。
Scala 没有做的两件事。第一个是类似 SQL 的语法。这无济于事:SQL 语法在 Scala 中显得格格不入。我认为可以肯定地说大多数 Scala 程序员更愿意使用他们熟悉的东西——所谓的理解。
另一件事是我还没有讨论过的,AST 操作。这是对已被编译器解析但尚未转换为字节码的代码进行操作的能力,从而能够在生成完成之前对其进行更改。
我认为这样的事情对 Scala 来说是一个福音——哎呀,对任何语言来说都是如此。但是,话又说回来,我有 Forth 程序员的背景,在编译代码时修改代码的能力是上帝赋予的权利。.Net 可以通过 LINQ 做到这一点,其他一些语言也可以,比如 Ruby。
由于当前缺少闭包,LINQ 在 Java 中会很困难。假设 Java 7 确实获得了相当紧凑的闭包支持和扩展方法,那么就“点表示法”而言的 LINQ 应该是可行的,即使它没有获得等效的查询表达式。
Google Collections Library (现在是 1.0 - 但准备好后将被Guava取代)包含许多必需的方法 - 我不会惊讶地看到 101 个类似 LINQ 的 API 在闭包支持看起来时出现合理的最终。
但是,我(目前)看不到 Java 获得像表达式树这样的东西 - 所以我怀疑除非您有自定义编译,否则您将仅限于 LINQ to Objects。
看看夸尔。它是一种类似于 LINQ 的 Java DSL,您可以将其作为库包含在内。例子:
// Get all StackOverflow users with more than 20,000 reputation points.
Iterable<User> topUsers = from("u").in(entityManager.entity(User.class)).
where(gt("u.getReputation()", 20000)).
select("u");
System.out.println("Users with more than 20,000 reputation:");
for (User u : topUsers) {
System.out.println(u.getName());
}
但是请注意,Java 没有类似于扩展方法的概念。Quaere 中的任何内容几乎都是您所坚持的;如果您需要制作自己的特殊实用程序,它们可能必须位于单独的实用程序类(ick)中。
此外,由于 Java < 7 没有本机闭包,因此您只能使用字符串来引用事物,并且您的 IDE 无法自省这些字符串以在您输入错误时向您显示问题。(但是,如果有人要为 Quaere 编写自省插件,更智能的 IDE 可能能够处理这个缺点。)
通过使用lambdaj库,您可以找到声誉最高的用户,如下所示:
List<User> topUsers =
select(users, having(on(User.class).getReputation(), greaterThan(20000)));
它在 Quaere 库方面具有一些优势,因为它不使用任何魔术字符串,它是完全类型安全的,并且在我看来它提供了更易读的 DSL。
您可以尝试在集合上实现可链接查询方法的 diting 。
Integer[] values = new Integer[] {0,1,2,3,4,5,6,7,8,9,10};
Enumerable<Integer> query = new Enumerable<Integer>(values).where(new Predicate<Integer>(){
@Override
public boolean evaluate(Integer value) throws Exception {
return value % 2 == 0;
}});
for(Integer i : query)
{
System.out.write(i);
System.out.write('\n');
}
CQEngine 或集合查询引擎http://code.google.com/p/cqengine/似乎非常有前途。虽然没试过。它允许您在集合上构建索引并查询它们。估计很快。
JVM上有没有像LINQ-2-SQL一样简单的东西?我想使用一些工具从数据库方案中生成实体(类),并使用它们直接与数据库交互。是否有无 XML 的解决方案?我不想注释类。在 .NET 中,该工具称为 sqlmetal。可以说,它是一种生成所有 DB 类的预处理器。
一旦完成,我认为使用 Scala 的内置语言结构会相当容易。