LINQ的Java是什么?

LINQJava等价物是什么?

342732 次浏览

没有什么比LINQ更适合Java。

编辑

现在有了Java8,我们介绍了流式接口,这是处理集合时类似的事情,但它与Linq不太一样。

如果您正在寻找的是ORM,例如Entity Framework,那么您可以尝试Hibernate

:-)

有一个名为quaere的项目。

它是一个Java框架,增加了查询集合的能力。

注意:根据作者的说法,该项目不再维护。

Java有许多LINQ等价物,请参阅这里进行比较。

对于类型安全的Quaere/LINQ样式框架,请考虑使用querydsl。Querydsl支持JPA/Hibernate、JDO、SQL和Java集合。

我是Querydsl的维护者,所以这个答案是有偏见的。

您可以使用lambdaj库以更具可读性的方式选择集合中的项目(以及更多)

https://code.google.com/archive/p/lambdaj/

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

JavaLINQ到SQL实现。与. NET LINQ相比,提供完整的语言集成和更大的功能集。

参见SBQL4J。它是与Java集成的类型安全强查询语言。允许编写复杂和乘法嵌套查询。有很多运算符,Java方法可以在查询中调用,作为构造函数。查询被翻译成纯Java代码(运行时没有反射),所以执行非常快。

编辑:到目前为止,SBQL4J是Java语言的唯一扩展,它提供了类似于LINQ的查询功能。有一些有趣的项目,如Quaere和JaQue,但它们只是API,而不是语法/语义学扩展,在编译时具有很强的类型安全性。

有另一种解决方案,冷却

Coolection并没有假装是新的lambda,但是我们被旧的遗留Java项目所包围,这个lib将在其中提供帮助。它使用和扩展非常简单,仅涵盖集合上最常用的迭代操作,如下所示:

from(people).where("name", eq("Arthur")).first();from(people).where("age", lessThan(20)).all();from(people).where("name", not(contains("Francine"))).all();

只是为了添加另一种选择:Java6确实有一个使用javax.persistence.criteria包的类型安全数据库查询解决方案。

虽然我必须说这不是真正的LINQ,因为使用LINQ,您可以查询任何IENumable。

除非您使用javacc创建自己的等效项,否则您将找不到LINQ的等效项。

在有人找到可行的方法之前,有一些很好的替代方案,例如

JaQu相当于Java的LINQ。虽然它是为H2数据库开发的,但它应该适用于任何数据库,因为它使用JDBC。

有编程语言Pizza(Java扩展),你应该看看它。-它使用“流利接口”的概念以声明性方式查询数据,原则上与LINQ w/o查询表达式(http://en.wikipedia.org/wiki/Pizza_programming_language)相同。但遗憾的是,它没有被追求,但它本来是一种将类似于LINQ的东西带入Java的方法。

Lambdas现在可用在Java8的形式JSR-335-JavaTM编程语言的Lambda表达式

更新JDK8现已发布包含项目lambda。值得获取Java8在行动的副本,目前仍为MEAP。

阅读与lambdas相关的Brian Goetz文章,了解lambdas是如何在JDK8中实现的,同时了解流、内部迭代、短路和构造函数参考…还可以查看上面的JSR以获得更多示例。

我写了一篇关于在JDK8中使用lambdas的一些优点的博客,名为箭的力量netbeans8也非常支持将构造转换为JDK8,我也写了一篇关于使用NetBeans迁移到JDK 8的博客。

有一个非常好的图书馆,你可以用它。

位置:https://github.com/nicholas22/jpropel-light

Lambdas要到Java8才能上市,所以使用它有点不同,感觉不那么自然。

您可以使用scala,它在语法上类似,实际上可能比linq更强大。

也许不是你希望的答案,但是如果你的代码的某些部分需要大量的集合工作(搜索、排序、过滤、转换、分析),你可以考虑在Clojurescala中编写一些类。

由于它们的功能性,使用集合是它们最擅长的。我对Scala没有太多经验,但使用Clojure,你可能会发现一个更强大的Linq触手可及,一旦编译,你生成的类将与代码库的其余部分无缝集成。

查看微小q。(请注意,您目前无法下载它。)

下面是一个改编自上述链接的示例:

首先我们需要一些数据的集合,比如说一组字符串

String[] strings = { "bla", "mla", "bura", "bala", "mura", "buma" };

现在我们只选择以“b”开头的字符串:

Query<String> stringsStartingWithB = new Query<String>(strings).where(new Query.Func<String, Boolean>(){public Boolean run(String in) {return in.startsWith("b");}});

没有实际的数据被复制或类似的东西,一旦你开始迭代,它就会被处理:

for(String string : stringsStartingWithB ) {System.out.println(string);}

听起来每个人都在谈论的Linq只是LinqToObject。我相信它只提供了今天在Java已经可以完成的功能,但语法非常丑陋。

我认为Linq在. Net中的真正力量是lambda表达式可以在需要委托或表达式的上下文中使用,然后将被编译成适当的形式。这就是允许像LinqToSql这样的东西(或除LinqToObject之外的任何东西)工作的原因,并允许它们具有与LinqToObject相同的语法。

看起来上面提到的所有项目都只提供了LinqToObject的功能。这让我觉得LinqToSql类型的功能还没有出现在Java的地平线上。

对于LINQ(LINQ to Object),Java8将具有等效的内容,请参阅项目Lambda

但是对于更复杂的LINQ,比如表情和ExpressionTree(如果LINQSQL和其他LINQ提供者想要提供优化和真实的东西,他们需要这些),还没有任何等效的东西,但也许我们将来会看到:)

但我不认为将来会有类似声明式查询的Java。

一位匿名用户提到了另一个,Dting

是一个类库,它通过链式方法和Linq等匿名接口提供对集合的查询能力。与大多数其他集合库不同,使用静态方法需要迭代整个集合,Dting提供了一个核心的可枚举类,其中包含可延迟的链式方法来实现对集合或数组的查询。

支持的方法:任何,强制转换,联系,包含,计数,不同的,元素在,除了,第一,第一个默认,分组通过,交集,加入,最后,最后默认,类型,订单通过,订单降序,反向,选择,选择许多,单,单默认,跳过,跳过,采取,采取,到数组,到数组列表,联合,其中

java中没有这样的功能。通过使用其他API,您将获得此功能。假设我们有一个包含name和id的动物对象。我们有一个包含动物对象的列表对象。现在如果我们想从列表对象中获取所有包含“o”的动物名称。我们可以编写以下查询

from(animals).where("getName", contains("o")).all();

上面的查询语句将列出名称中包含“o”字母表的动物。更多信息请通过以下博客。http://javaworldwide.blogspot.in/2012/09/linq-in-java.html

对于基本的函数集合,Java8内置了它,大多数主要的非JavaJVM语言都内置了它(Scala、Clojure等),您可以为早期的Java版本添加库。

对于SQL数据库的完整语言集成访问,Scala(在JVM上运行)具有Slick

我尝试了谷歌的番石榴库。它有一个FluentIterable,我认为它接近LINQ。另见功能定义

List<String> parts = new ArrayList<String>();  // add parts to the collection.FluentIterable<Integer> partsStartingA =FluentIterable.from(parts).filter(new Predicate<String>() {@Overridepublic boolean apply(final String input) {return input.startsWith("a");}}).transform(new Function<String, Integer>() {@Overridepublic Integer apply(final String input) {return input.length();}});

似乎是一个广泛的Java库。当然不像LINQ那样简洁,但看起来很有趣。

不是真正的"Linq to SQL"相当于Java.但接近它的东西。

没有等效于LINQ的Java。但是有一些外部API看起来像LINQ,例如https://github.com/nicholas22/jpropel-lighthttps://code.google.com/p/jaque/

HQL (Hibernate Query Language).Net中的Linq非常相似

现在我读了它,发现它像linq,但更简单,更不可读。但是scala可以在linux上运行,对吧?夏普需要单声道。

LINQ到对象-JAVA 8添加了Stream API,它增加了对值流的函数式操作的支持:

包java.util.stream

Java8解释:将Lambdas应用于Java集合

LINQ toSQL /NHibernate/etc.(数据库查询)-一种选择是使用JINQ,它也使用新的JAVA 8功能,并于2014年2月26日在Github上发布:https://github.com/my2iu/Jinq

Jinq为开发人员提供了一种简单而自然的数据库编写方法Java中的查询。您可以像对待普通Java对象一样对待数据库数据存储在集合中。您可以迭代它们并使用正常Java命令,您的所有代码将自动转换为优化的数据库查询。最后,LINQ风格可查询Java!

JINQ项目网站:http://www.jinq.org/

你可以试试这个库:https://code.google.com/p/qood/

以下是使用它的一些理由:

  1. 轻量级:只需9个公共接口/类即可学习。
  2. 类似SQL查询:支持分组、按顺序、左加入、公式…等等
  3. 对于大数据:使用文件(QFS)而不是堆内存。
  4. 尝试解决对象关系阻抗失配

您可以尝试我的库商品查询。它允许对对象集合运行类似LINQ的查询。你必须传递谓词,就像在LINQ中一样。如果你使用的是java6/7,那么你必须使用旧的语法来处理接口:

List<String> names = Queryable.from(people).filter(new Predicate<Person>() {public boolean filter(Person p) {return p.age>20;}}).map   (new Converter<Person,String>() {public Integer convert(Person p) {return p.name;}}).toList();

你也可以在Java8中使用它,或者在旧的java中使用RetroLambda并且它是gradle插件,那么你将拥有新的花哨语法:

List<String> names = Queryable.from(people).filter(p->p.age>20).map   (p->p.name).toList();

如果您需要运行DB queryes,那么您可以查看JINQ,如上所述,但它不能由RetroLambda反向移植,因此可以使用序列化的lambda。

在2014年,我终于可以说LINQ终于在java 8中出现了。所以不再需要找到LINQ的替代品了。

https://code.google.com/p/joquery/

支持不同的可能性,

鉴于收藏,

Collection<Dto> testList = new ArrayList<>();

的类型,

class Dto{private int id;private String text;
public int getId(){return id;}
public int getText(){return text;}}

过滤器

Java7

Filter<Dto> query = CQ.<Dto>filter(testList).where().property("id").eq().value(1);Collection<Dto> filtered = query.list();

Java8

Filter<Dto> query = CQ.<Dto>filter(testList).where().property(Dto::getId).eq().value(1);Collection<Dto> filtered = query.list();

还有,

Filter<Dto> query = CQ.<Dto>filter().from(testList).where().property(Dto::getId).between().value(1).value(2).and().property(Dto::grtText).in().value(new string[]{"a","b"});

排序(也可用于Java7)

Filter<Dto> query = CQ.<Dto>filter(testList).orderBy().property(Dto::getId).property(Dto::getName)Collection<Dto> sorted = query.list();

分组(也可用于Java7)

GroupQuery<Integer,Dto> query = CQ.<Dto,Dto>query(testList).group().groupBy(Dto::getId)Collection<Grouping<Integer,Dto>> grouped = query.list();

加入(也可用于Java7)

鉴于,

class LeftDto{private int id;private String text;
public int getId(){return id;}
public int getText(){return text;}}
class RightDto{private int id;private int leftId;private String text;
public int getId(){return id;}
public int getLeftId(){return leftId;}
public int getText(){return text;}}
class JoinedDto{private int leftId;private int rightId;private String text;
public JoinedDto(int leftId,int rightId,String text){this.leftId = leftId;this.rightId = rightId;this.text = text;}
public int getLeftId(){return leftId;}
public int getRightId(){return rightId;}
public int getText(){return text;}}
Collection<LeftDto> leftList = new ArrayList<>();
Collection<RightDto> rightList = new ArrayList<>();

可以加入像,

Collection<JoinedDto> results = CQ.<LeftDto, LeftDto>query().from(leftList).<RightDto, JoinedDto>innerJoin(CQ.<RightDto, RightDto>query().from(rightList)).on(LeftFyo::getId, RightDto::getLeftId).transformDirect(selection ->  new JoinedDto(selection.getLeft().getText(), selection.getLeft().getId(), selection.getRight().getId())).list();

表达式

Filter<Dto> query = CQ.<Dto>filter().from(testList).where().exec(s -> s.getId() + 1).eq().value(2);

现在Java8支持lambda,可以创建与LINQ非常相似的JavaAPI。

金克是这些新的用于Java的LINQ样式库之一。

我是这个库的开发人员。它基于五年来关于使用字节码分析将Java转换为数据库查询的研究。类似于C#的D-LINQ是位于实体框架之上的查询层,Jinq能够充当位于JPA或jOOQ之上的查询层。它支持聚合、组和子查询。甚至Erik Mayjer(LINQ的创建者)也有承认金克

您可以在Android上使用与Java1.7兼容的Java函数式Utils来转换C#的101个LINQ示例

无耻的自我插入:你总是可以使用https://github.com/amoerie/jstreams

适用于Java6及以上,非常适合Android开发。

它看起来很像Scala运算符、洛达什、C#LINQ等。