LINQ的Java等价物是什么?
当前回答
听起来大家在这里谈论的Linq只是LinqToObjects。我认为,它只提供了今天已经可以用Java实现的功能,但语法非常难看。
我认为Linq在.Net中的真正优势在于,lambda表达式可以在需要委托或表达式的上下文中使用,然后将其编译为适当的形式。这使得LinqToSql(或LinqToObjects以外的任何东西)这样的东西能够工作,并允许它们具有与LinqToObject相同的语法。
看起来上面提到的所有项目都只提供LinqToObjects的功能。这让我觉得LinqToSql类型的功能对于Java来说还没有出现。
其他回答
您可以使用lambdaj库以更易读的方式选择集合中的项目(以及更多)
https://code.google.com/archive/p/lambdaj/
它比Quaere库有一些优势,因为它不使用任何魔法字符串,它完全是类型安全的,在我看来,它提供了一个更可读的DSL。
对于基本的函数集合,Java8内置了它,大多数主要的非Java JVM语言(Scala、Clojure等)都内置了它。
对于SQL数据库的完全语言集成访问,Scala(在JVM上运行)具有Slick
有一个叫做quaere的项目。
这是一个Java框架,它增加了查询集合的能力。
注:根据作者的说法,该项目已不再维护。
也许不是你所希望的答案,但如果你的代码的某些部分需要在集合上做大量工作(搜索、排序、过滤、转换、分析),你可以考虑用Clojure或Scala编写一些类。
由于其功能性,使用集合是他们最擅长的。我对Scala没有太多经验,但使用Clojure,您可能会发现一个更强大的Linq,一旦编译,您将生成的类将与其他代码库无缝集成。
参见SBQL4J。它是与Java集成的类型安全的强查询语言。允许编写复杂和多重嵌套查询。有很多运算符,Java方法可以作为构造函数在查询中调用。查询被转换为纯Java代码(在运行时没有反射),因此执行速度非常快。
编辑:到目前为止,SBQL4J是Java语言的唯一扩展,它提供了类似LINQ的查询功能。有一些有趣的项目,比如Quaere和JaQue,但它们只是API,而不是编译时具有强类型安全性的语法/语义扩展。
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 如何检查IEnumerable是否为空或空?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder