不久前我有一个项目的想法,我打算编写一个Java库,允许使用SQL语法对数组进行排序和选择。
我的想法是你可以像这样从数组中选择:
int[] nums = new int[] { 0, 5, 7, 2, 4, 9, 3, 1, 6, 8 }
int result = select().from(nums).where("value > 2").and("value < 8").sort("ASC");
这将返回一个像这样的新数组:
{ 3, 4, 5, 6, 7 }
我还没有想过这么做的具体实现或原因,但我认为这将是一个非常有趣的尝试。
我的问题是,这样的事情真的存在吗?或者有什么特别的办法吗?
我也认为这可能是有用的Object
数组,你可以选择多个字段,像这样:
select().from(array).where("Field1 = "+someValue).or("Field1 = "+anotherValue);
可能性是无穷无尽的。但是我不确定从哪里开始,或者更确切地说,如何开始实现这些方法。
这更像是一个"去哪里"而不是一个带答案的问题,所以任何帮助都将是有用的。
你正在寻找的是类似于c#中的LINQ的东西。
初学者可以参考这些链接
LINQ for Java tool
在Java中LINQ的等效是什么?
你可能还想看看c#中可用的lambda表达式。我不知道还能建议什么。
但是如果你试图在java中构建类似LINQ的东西,那么它有点复杂。您需要以面向对象的方式进行思考,以无缝地形成sql查询。如果是这样的话,那么答案是相当长的(或大err..)
你是对的,我认为这将是一个有趣的项目。
有很多方法可以做到这一点。一种方法是创建一个Query
对象,通过依次调用这些方法来构建该对象。
所以像这样:
public class Query {
public static Query select(String...fields){
//code omitted
return query;
}
public Query from(Collection<Object> collection){
//code omitted
return this;
}
public Query where(String field, Object value){
//code omitted
return this;
}
}
那么你可以这样写:
Query.select("field1", "field2").from(myList)....
您需要跟踪在每个点选择了哪些值,以及它们的下一个条件是应该添加到它们(如or
的情况)还是从它们中删除(如and
的情况)。会有很多边缘情况。我的建议是从一些非常简单的东西开始,比如ints
的例子,然后从那里开始工作。
当你开始做对象版本时,你需要使用反射来访问对象的字段。
一旦你这样做了,你可能想要考虑通过使用泛型来提高代码的类型安全性。
总而言之,一个有趣的项目有很多范围。然而,这感觉像是会有很多边缘情况的事情,所以值得仔细考虑一下设计,并且做一些单元测试也不是一个坏主意。
Java LINQ之类的东西?
嗯,有jxpath,它允许一个人在java集合上做xpath风格的查询,这就是你想要的。
jOOQ库具有与您所描述的查询类似的查询,但据我所知,它意味着在实际数据库上使用。