26

开始用 C# 学习 LINQ。
尤其是 LINQ to Objects 和 LINQ to XML。
我真的很喜欢 LINQ 的强大功能。

我了解到有一种叫做JLINQ的 JavaScript 实现。
此外(正如 Catbert 发布的)Scala 将具有LINQ

你知道 LINQ 或类似的东西是否会成为 Java 7 的一部分吗?

更新:2008 年的有趣帖子 - LINQ for Java 工具

4

8 回答 8

33

看看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
}
于 2010-01-05T18:41:04.447 回答
30

重要的是要注意 LINQ 有四件事:

  • 一元理解
  • 数据库集成
  • 类似 SQL 的语法
  • AST操纵

刚听说过的人可能会认为它只是数据库集成。使用过它的人可能会想到类似 SQL 的语法。那些真正深入研究的人会意识到它的一元理解方面,即使他们不知道它是什么。

以 Scala 为例,它具有一元理解,而没有其他三个。有一个名为ScalaQuery的库,它通过单子理解提供数据库集成(这样做的内在能力是单子很酷的主要原因)。我认为另一个名为ScalaQL的项目打算提供几乎相同的东西,但使用编译器插件来增强它。我不知道你提到的 Miguel Garcia 的工作,但是,看到他完成的其他工作,我很兴奋。

然而,一个人不需要特殊的语法来进行单子理解。它只是使它不受样板的影响。因此,具有适当泛型支持级别的语言可以立即使用它的这一方面。

Scala 没有做的两件事。第一个是类似 SQL 的语法。这无济于事:SQL 语法在 Scala 中显得格格不入。我认为可以肯定地说大多数 Scala 程序员更愿意使用他们熟悉的东西——所谓的理解。

另一件事是我还没有讨论过的,AST 操作。这是对已被编译器解析但尚未转换为字节码的代码进行操作的能力,从而能够在生成完成之前对其进行更改。

我认为这样的事情对 Scala 来说是一个福音——哎呀,对任何语言来说都是如此。但是,话又说回来,我有 Forth 程序员的背景,在编译代码时修改代码的能力是上帝赋予的权利。.Net 可以通过 LINQ 做到这一点,其他一些语言也可以,比如 Ruby。

于 2010-01-06T15:52:09.747 回答
13

由于当前缺少闭包,LINQ 在 Java 中会很困难。假设 Java 7 确实获得了相当紧凑的闭包支持和扩展方法,那么就“点表示法”而言的 LINQ 应该是可行的,即使它没有获得等效的查询表达式。

Google Collections Library (现在是 1.0 - 但准备好后将被Guava取代)包含许多必需的方法 - 我不会惊讶地看到 101 个类似 LINQ 的 API 在闭包支持看起来时出现合理的最终。

但是,我(目前)看不到 Java 获得像表达式树这样的东西 - 所以我怀疑除非您有自定义编译,否则您将仅限于 LINQ to Objects。

于 2010-01-05T18:33:35.463 回答
11

看看夸尔。它是一种类似于 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 可能能够处理这个缺点。)

于 2010-01-05T18:28:26.737 回答
11

通过使用lambdaj库,您可以找到声誉最高的用户,如下所示:

List<User> topUsers = 
    select(users, having(on(User.class).getReputation(), greaterThan(20000)));

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

于 2010-01-10T16:18:48.020 回答
4

您可以尝试在集合上实现可链接查询方法的 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');
   }
于 2012-09-10T02:12:28.210 回答
3

CQEngine 或集合查询引擎http://code.google.com/p/cqengine/似乎非常有前途。虽然没试过。它允许您在集合上构建索引并查询它们。估计很快。

于 2013-02-08T19:42:20.250 回答
2

JVM上有没有像LINQ-2-SQL一样简单的东西?我想使用一些工具从数据库方案中生成实体(类),并使用它们直接与数据库交互。是否有无 XML 的解决方案?我不想注释类。在 .NET 中,该工具称为 sqlmetal。可以说,它是一种生成所有 DB 类的预处理器。

一旦完成,我认为使用 Scala 的内置语言结构会相当容易。

于 2010-02-07T17:54:22.593 回答