LINQ的Java等价物是什么?

What is the Java equivalent for LINQ?

什么是等价于LINQ的Java?


对于Java来说,没有什么类似LINQ的。

编辑

现在,Java 8被引入流API,这是处理集合时类似的事情,但它与LINQ并不完全相同。

如果它是您正在寻找的ORM,如实体框架,那么您可以尝试休眠。

-)


还有另一种解决方案,CoolSelection。

冷却没有假装是新的lambda,但是我们被旧的遗留Java项目所包围,这个LIB将有帮助。它的使用和扩展非常简单,只涉及在集合上迭代最常用的操作,如:

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


Lambda表达式是现在可在8形式的JSR Java在335个lambda表达式的JavaTM编程语言

更新:这是jdk8安切洛蒂现在发布的包含项目的lambda。值得抢占拷贝java 8行动正在安静的环境。

一个有关于读取(brian goetz Lambda表达式的知识非常了解,所以在Lambda表达式是实现jdk8获得理解流在内部短路,迭代,和建设者参考。因此,退房的JSR的主题得到进一步的例子。

我已经写在我的博客中使用Lambda表达式称为优势的电力jdk8箭头,所以安切洛蒂NetBeans 8转换到大的支持结构jdk8所以这我已经升级到8个blogged JDK和NetBeans。


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

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

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


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

直到有人找到一个可行的方法,有一些好的选择,例如

  • 乔克
  • 金币
  • 贾克
  • 贾奎
  • LIQ4J
  • Quaere(不再维护)
  • QueDSDSL
  • JSR—34


LINQ to Objts - Java 8添加了流API,它支持对值流的功能样式操作的支持:

包java.util.stream

Java 8解释:将lambdas应用到Java集合

LINQ to SQL/NHierBATEng/等(数据库查询)-一种选择是使用JINQ,它也使用新的Java 8特性,并在2014年2月26日发布在GITHUB:HTTPSE//GITHUBCOM/MY2IU/JINQ上。

Jinq provides developers an easy and natural way to write database
queries in Java. You can treat database data like normal Java objects
stored in collections. You can iterate over them and filter them using
normal Java commands, and all your code will be automatically
translated into optimized database queries. Finally, LINQ-style
queries are available for Java!

金秋项目网址:http://www.jinq.org/


有一个项目叫Quaere。

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

注:据作者介绍,本项目不再维护。


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

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

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


你可以使用Scala的语法类似,它是在它可能是更强大的比LINQ的。


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


一个类似C的解决方案是JAQUE,它为Java LAMBDAS提供了表达式树。除此之外,还可以实现特定于域的LINQ提供程序。


现在Java 8支持LAMBDAS,可以创建非常类似于LINQ的Java API。

Jinq是Java的新LINQ样式库之一。

我是这个图书馆的开发人员。它是基于五年的使用字节码分析来翻译Java到数据库查询的研究。类似于c的d-linq是一个位于实体框架顶部的查询层,jinq可以充当位于jpa或jooq顶部的查询层。它支持聚合、组和子查询。甚至连林肯的创造者埃里克·梅杰(ErikMeijer)也承认了金。


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

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


我在谷歌上尝试了番石榴图书馆。它有一个FluentIterable,我认为它接近linq。另请参见功能说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
List<String> parts = new ArrayList<String>();  // add parts to the collection.    
FluentIterable<Integer> partsStartingA =
    FluentIterable.from(parts).filter(new Predicate<String>() {
        @Override
        public boolean apply(final String input) {
            return input.startsWith("a");
        }
    }).transform(new Function<String, Integer>() {
        @Override
        public Integer apply(final String input) {
            return input.length();
        }
    });

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


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

支持不同的可能性,

给定集合,

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

类型的,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Dto
{
    private int id;
    private String text;

    public int getId()
    {
        return id;
    }

    public int getText()
    {
        return text;
    }
}

滤波器

爪哇7

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

爪哇8

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

也,

1
2
3
4
5
6
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"});

排序(也适用于Java 7)

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

分组(也可用于Java 7)

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

连接(也可用于Java 7)

鉴于,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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<>();

可以像,

1
2
3
4
5
6
7
8
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();

表达

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

它听起来像一个大家都在谈论这里的LINQ的只是linqtoobjects。我相信我们可以从已经完成的功能在今天的Java语法,但真的很丑陋。

我湖为实际电力网中的LINQ是lambda表达式。可以用在上下文的要求是A或A代表表达和然后编译到适当的形状。这是一个什么样的东西linqtosql允许(或任何其他比linqtoobjects)工作,让他们有一个linqtoobjects语法相同。

它看起来像所有的项目或是一只以上的大学linqtoobjects发行能力。这是我的东西linqtosql型的功能是不是在地平线for Java。


对于基本的功能集合,Java 8内置了它,大多数主要的非Java JVM语言都内置了它(Scala、Culjule等),并且可以为早期的Java版本获得附加的LIBs。

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


只是添加另一种选择:Java 6确实有一种使用JavaX.Sturnist.ValueSpple解决类型安全数据库查询的方法。

尽管我必须说这不是真正的LINQ,因为通过LINQ,您可以查询任何IEnumerable。


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

1
2
3
4
5
6
7
8
9
10
11
12
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中使用RexLAMBDA和它的GrADLE插件,那么您将有新的花俏语法:

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

如果您需要运行db queryes,那么您可以查看jinq,如上所述,但它不能由reverlambda返回,doe使用序列化lambda。


有一个很好的图书馆,你可以使用。

坐落在:http:////jpropel光github.com nicholas22

Lambda表达式不可用,直到8个Java,所以它是一个位的使用不同的和不自然的感觉一样。


查询(LINQ to Objects for Java),8,有一些等价的lambda,湖项目。

它可枚举的LINQ to对象扩展样stuffs。但更多的东西来表达复杂的类和expressiontree(这是需要在LINQ to SQL的LINQ的供应商,如果他们想和其他提供优化和真实的东西),但没有任何等效,但也许我们会看到在未来的:)

但我不认为会有什么样的未来在Java中宣告的查询。


没有Java的搜索功能。你想使用其他的API获取本特征。认为我们有一类含动物名称和对象的ID。我们有动物对象列表对象。现在,如果我们想得到的都是动物的名字中包含的"O"从列表对象。我们可以用下面的查询

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

上述查询语句的列表,其中包含的动物想要的字母"O"在他们的名字。更多的信息请走下面的博客。javaworldwide.blogspot.in http:/ / / / / linq-in-java.html 2012年09


退房的小Q。(注,你目前不能下载。)

这是一个例子:在上面的链接适应

First we need a collection of some data, let's say a set of strings

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

Now we want to select only the strings which start with"b":

1
2
3
4
5
6
7
Query<String> stringsStartingWithB = new Query<String>(strings).where(
    new Query.Func<String, Boolean>(){
        public Boolean run(String in) {
            return in.startsWith("b");
        }
    }
);

No actual data moved copied or anything like that, it will get processed as soon as you start iterating:

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

也许你需要的答案,但有希望的,如果你的一部分的代码需要重型的工作集合(搜索,排序,过滤,转换,你可能需要考虑分析)在写一些在Clojure或Scala类。

因为他们的工作需要所有的功能自然是什么,在他们最好的。我不有多是Scala和Clojure的体验,但你可能会找到一个更强大的LINQ的在你的指尖,和一种新的类,你会seamlessy将与其余的代码库。


JaQu是Java的LINQ等价物。尽管它是为h2数据库开发的,但它应该适用于任何数据库,因为它使用JDBC。


匿名用户:一个和另一个,diting

Diting is a class library provides query capabilities on collections through chainable methods and anonymous interface like Linq in .NET. Unlike most of other collection library those are using static methods need iterate whole collection, Diting provides a core Enumerable class whitch contains deffered chainable methods to implement query on collection or array.

Supported Methods: any, cast, contact, contains, count, distinct, elementAt, except, first, firstOrDefault, groupBy, interset, join, last, lastOrDefault, ofType, orderBy, orderByDescending, reverse, select, selectMany, single, singleOrDefault, skip, skipWhile, take, takeWhile, toArray, toArrayList, union, where


现在我开始读它,发现它和LINQ一样,但更简单,更难以阅读。但是scala可以在Linux上运行,是吗?CSharp需要单声道。


无耻的自插:你可以一直使用https://github.com/amorie/jstreams

在Java 6和UP上工作,非常适合Android开发。

它看起来很像scala操作符、lodash、c linq等。


有编程语言比萨饼(Java扩展),你应该看看它。-它使用"fluent interfaces"的概念以声明性的方式查询数据,原则上与linq w/o查询表达式(http://en.wikipedia.org/wiki/pizza_programming_language)相同。但遗憾的是,它没有被追求,但它可能是获得类似于LINQ到Java的一种方式。


不是真正的Java的EDCOX1 1Ω等价物。但有点接近它。查询DSL


Java没有等价的LINQ。但是有一些外部API看起来像LINQ,比如https://github.com/nicholas22/jprople-light、https://code.google.com/p/jaque。/


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


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

以下是使用它的一些原因:

  • 轻量级:只有9个公共接口/类可以学习。
  • 类似SQL的查询:支持group by、order by、left join,公式、……等
  • 对于大数据:使用文件(qfs)而不是堆内存。
  • 尝试解决对象关系阻抗失配问题。

  • 您可以使用Java功能UTIL来转换与Android上的Java 1.7兼容的C 101的LINQ实例。