有没有办法在Java数据结构上执行SQL Like Queries或Filtering?
我希望按照包含在
中的对象的字段过滤ArrayList和HashMap中的对象答案 0 :(得分:5)
您可能喜欢Quaere,这是一种相当丰富的java对象图查询语言:
Integer[] numbers={5, 4, 1, 3, 9, 8, 7, 2, 0};
Iterable<Integer> lowNumbers=
from("n").in(numbers).
where(lt("n",5).
select("n");
答案 1 :(得分:4)
没有标准的类SQL语言,但是apache commons collections has a filter方法可以做你想做的事。不难推出自己的,
public <T> Collection<T> filter (Collection<T> c, Condition<T> condition) {
ArrayList<T> list = new ArrayList<T>():
for (T t: c){
if (condition.isSatisfied(t)) { list.add(t); }
}
return list;
}
public interface Condition<T> {
public boolean isSatisfied(T t);
}
答案 2 :(得分:3)
是和否。
不,不是SQL语法。
是的,使用过滤器仿函数。特别是,请查看Apache Commons Collections,CollectionsUtils.filter()函数,该函数将Predicate对象应用于Collection。
你编写谓词,Apache类负责其余的工作。
答案 3 :(得分:3)
规范的方法是迭代数据结构并将所需的对象插入到新的对象中。遗憾的是,Java没有列表推导或一流功能。但我们可以使用像Functional Java这样的库来模拟它们:
import fj.F;
import fj.data.List;
import static fj.data.List.list;
import static fj.pre.Show.listShow;
import static fj.pre.Show.stringShow;
List<String> myList = list("one", "two", "three").filter(
new F<String, Boolean>() {
public Boolean f(String s) {
return s.contains("e");
}
});
listShow(stringShow).print(myList);
这会将["one", "three"]
打印到标准输出。
答案 4 :(得分:1)
有很多解决方案可以利用XPath或XQuery。首先来看看Jaxen。
答案 5 :(得分:0)
一个相当极端的解决方案可能是使用某种ORM将Java对象映射到实际的SQL数据库,然后使用实际的SQL或类似SQL的语言(如Hibernate的HQL)来精确地查询对象。
当然,我只是认真地考虑,如果我实际上计划在数据库中保留对象,那么否则它就会过度。