Java中是否有任何库可以提供Linq的功能?
Java中是否有任何库可以提供Linq的功能?
Answers:
为了获得完整的LINQ查询语法,您需要更新语言规范和支持新关键字和语法结构的编译器。这远远超出了大多数读者的理解。
为了在Java中获得类似于Linq的方法链语法,其外观和工作方式类似于C#中的语法,您需要Java不支持的两件事:扩展方法(可以像实例方法一样适用于实例的静态方法)和lambda表达式(匿名委托)。但是,如果您愿意承担一些额外的编码冗长性,则可以用现有的Java构造来欺骗这两者。我发现Java特别令人惊奇的一件事是能够创建匿名接口实现。应用于具有单个纯函数的接口,该函数基本上允许简单的匿名委托,前提是您具有所需的每个方法签名的接口。
因此,作为方法链的Linq的IEnumerable(对于Javaheads而言是Iterable)方面,应该可以在Java中近似;您基本上可以将其实现为控制Monad的流畅接口。您需要一个类似于的类LinqIterable
,实现Iterable,该类:
因此,您可能会定义一个“流利的”库,该库将允许诸如以下语句:
Map<String, Integer> results = Linq.FromIterable(sourceList)
.Where(new Predicate{public bool Op(SomeStruct in){return in.SomeString == "criteria";}})
.OrderBy(new Func{public String Op(SomeStruct in){return in.SomeOtherString;}})
.Select(new Func{public SomeOtherStruct Op(SomeStruct in){return new SomeOtherStruct(in.SomeOtherString, in.SomeInt);}})
.ToMap(new Func{public String Op(SomeOtherStruct in){return in.StringField;}},
new Func{public Integer Op(SomeOtherStruct in){return in.IntField;}});
创建实际图书馆的工作远远超出了互联网问答的答案范围。我只是说有可能,并不容易。
表达式树不是火箭科学,但要实现.NET在该领域的功能,这将是一个重要的项目。您不仅需要构建表达式树的能力,还需要能够使用发出的字节码即时“编译”该树;我不知道Java的反射功能是否如此强大。
看到:
不。Linq需要Java刚具备的许多语言功能
使用Scala的.NET端口。它使您可以完全本地访问.NET中的所有内容,其中显然包括LINQ。
如果不能,则可以尝试使用诸如functionjava或lambdaj之类的库,但您不会真正接近LINQ。
您可以使用Korma(DSL)来处理用Clojure编写的SQL查询。
语法非常简洁:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
您可以通过导入相关的Clojure库并仅使用常规的Clojure / Java互操作从Java中轻松地调用它。
Java中没有模仿linq的本机功能。但是,有几种API提供相同的功能。
例如,此博客文章有一个自定义jar来复制linq。
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
这是帖子中API的示例用法:
假设我们有一个动物对象,其中包含名称和ID,并以的列表表示animals
。如果要从列表中获取所有包含“ o”的动物名称animals
,则可以编写以下查询
from(animals).where("getName", contains("o")).all();
where("getName", ...)
。