是否有类似LINQ for Java的东西?

Kb.*_*Kb. 25 java linq closures scala java-7

开始用C#学习LINQ.
特别是LINQ to Objects和LINQ to XML.
我非常喜欢LINQ的强大功能.

我了解到有一种叫做JLINQ的Jscript实现.
另外(正如Catbert发布​​的那样)Scala将拥有LINQ

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

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

cat*_*ert 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
}
Run Code Online (Sandbox Code Playgroud)

  • @catbert:我添加了一个示例来演示Scala的查询功能.:) (2认同)

Dan*_*ral 30

值得注意的是LINQ有四件事:

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

刚刚听说过它的人可能会把它简单地想象为数据库集成.与之相关的人可能会想到类似SQL的语法.那些真正挖掘过的人会意识到它的monadic理解方面,即使他们不知道它是什么.

例如,如果一个人使用Scala,那么它没有其他三个就具有monadic理解力.有一个名为ScalaQuery的库,它通过monadic理解提供数据库集成(这样做的内在能力是monad很酷的主要原因).我认为另一个名为ScalaQL的项目打算提供几乎相同的东西,但是使用编译器插件来增强它.我没有意识到你提到的Miguel Garcia的工作,但是,看到他已经完成的其他事情,我很高兴.

然而,不需要特殊的语法来进行monadic理解.它只是通过样板制作整洁.因此,具有适当级别的泛型支持的语言可立即使用它.

Scala不做的两件事.第一种是类似SQL的语法.这无济于事:SQL语法在Scala中看起来不合适.我认为可以肯定地说,大多数Scala程序员宁愿选择他们熟悉的东西 - 所谓的理解.

另一件事是我尚未讨论过的,AST操纵.这是操作已由编译器解析但尚未在字节代码中转换的代码的能力,授予在生成完成之前更改它的能力.

我认为这样的事情对斯卡拉来说是一个福音 - 对任何语言来说都是如此.但是,再一次,我有一个Forth程序员的背景,在编译时改变代码的能力是上帝赋予的权利..Net可以通过LINQ来实现,其他语言也是如此,例如Ruby.

  • AST Manipulation是Expressions Tree的用武之地.有关更多讨论,请参见http://stackoverflow.com/questions/1430738/what-is-the-max-linq-expression-trees-can-do. (2认同)

Jon*_*eet 13

由于目前缺少关闭,LINQ在Java方面会很难.假设Java 7中真正确实得到合理紧凑封闭的支持和扩展方法,LINQ中的"点号"的术语应该是可行的,即使它没有得到查询表达式的等价物.

谷歌集合库(现为1.0 -但被替换番石榴当准备好)含有许多必需的方法-我也不会感到惊讶地看到101 LINQ样的API尽快涌现当封闭支持长相合理的决赛.

我现在看不到(现在)Java获得类似表达式树的东西 - 所以我怀疑除非你有自定义编译,否则你将被限制为LINQ to Objects.

  • @Kb:闭包在C#中也称为lambdas,它们是支持LINQ的主要特性(扩展方法是另一种,但它们不那么重要).表达式树是LINQ to SQL(和其他类似的东西)背后的力量,但是,像Jon说的那样,Java 7不会出现这些. (2认同)

Mar*_*sco 11

通过使用lambdaj库,您可以找到顶级信誉用户,如下所示:

List<User> topUsers = 
    select(users, having(on(User.class).getReputation(), greaterThan(20000)));
Run Code Online (Sandbox Code Playgroud)

它有一些优点尊重Quaere库,因为它不使用任何魔术字符串,它是完全类型安全的,在我看来它提供了更可读的DSL.


Joh*_*lla 10

看看Quaere.它是一个类似LINQ的DSL for Java,可以作为库包含在内.例:

// 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());
}
Run Code Online (Sandbox Code Playgroud)

但是,请注意Java没有类似于扩展方法的概念.无论Quaere是什么,几乎都是你所困扰的; 如果您需要创建自己的特殊实用程序,它们可能必须位于单独的实用程序类(ick)中.

另外,因为Java <7没有本机闭包,所以你仍然坚持使用字符串来引用内容,如果你输入错误的东西,你的IDE就无法反省那些向你展示问题的内容.(更智能的IDE可能能够处理这个缺点,但是,如果有人要为Quaere编写内省插件.)

  • 魔术弦的可怕丑陋使用.也许使用Java 7的闭包可以变得更好. (7认同)