代码之家  ›  专栏  ›  技术社区  ›  Kb.

有类似LINQ for Java的东西吗[关闭]

  •  25
  • Kb.  · 技术社区  · 16 年前


    特别是LINQ到对象和LINQ到XML。

    我知道有一种东西叫做 JLINQ
    同样(正如卡特伯特所说)Scala也将拥有 LINQ

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

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

    8 回复  |  直到 6 年前
        1
  •  33
  •   missingfaktor Kevin Wright    16 年前

    看看 Scala ,这是一种功能强大的函数式编程语言,但类似于Java,运行在Java平台上。

    编辑:

    下面是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
    }
    
        2
  •  30
  •   Kb.    16 年前

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

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

    ScalaQuery 它通过一元理解提供数据库集成(这样做的内在能力是单子很酷的主要原因)。另一个项目叫做 ScalaQL ,我认为,打算提供几乎相同的东西,但使用编译器插件来增强它。我不知道你提到的米格尔·加西亚的工作,但是,看到他完成的其他工作,我很激动。

    Scala没有做两件事。第一种是类似SQL的语法。这一点无济于事:SQL语法在Scala中看起来不合适。我认为可以肯定地说,大多数Scala程序员更喜欢他们熟悉的东西——所谓的理解。

    另一件事是我还没有讨论的,AST操纵。这是一种操作已由编译器解析但尚未转换为字节码的代码的能力,允许在生成完成之前对其进行修改。

    我认为这样的事情对Scala是一个福音——见鬼,对任何语言都是如此。但是,再一次,我有一个作为第四程序员的背景,能够在编译时修改代码是上帝赋予我的权利。Net可以通过LINQ实现,其他一些语言也可以,比如Ruby。

        3
  •  13
  •   Jon Skeet    16 年前

    由于目前缺少闭包,LINQ在Java中很难实现。假设Java7真的 做 为了获得合理紧凑的闭包支持和扩展方法,LINQ在“点表示法”方面应该是可行的,即使它没有得到查询表达式的等价物。

    Google Collections Library Guava 当它准备好的时候)包含许多必需的方法——当闭包支持看起来相当最终时,101个类似LINQ的API就出现了,我不会感到惊讶。

    但是,我看不到(目前)Java得到任何类似表达式树的东西,因此我怀疑,除非您有自定义编译,否则您将仅限于LINQ to对象。

        4
  •  11
  •   John Feminella    16 年前

    Quaere

    // 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<7没有本机闭包,只能使用字符串来引用内容,如果输入错误,IDE无法反思这些内容以显示问题(然而,如果有人为Quaere编写内省插件,一个更智能的IDE可能能够处理这个缺点。)

        5
  •  11
  •   Mario Fusco    16 年前

    lambdaj 图书馆您可以找到声誉最高的用户,如下所示:

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

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

        6
  •  4
  •   Anuj Balan    14 年前

    你可以试试 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');
       }
    
        7
  •  3
  •   Faheem Sohail    13 年前

    CQEngine或集合查询引擎 http://code.google.com/p/cqengine/ 看起来非常有希望。但我还没试过。它允许您在集合上构建索引并查询它们。应该很快。

        8
  •  2
  •   Mohamed Bana    16 年前

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

    推荐文章