【发布时间】:2009-04-10 02:48:55
【问题描述】:
有没有办法在 Java 数据结构上执行 SQL 之类的查询或过滤?
我想通过其中包含的对象的字段过滤 ArrayList 和 HashMap 中的对象。
【问题讨论】:
标签: java sql data-structures collections jakarta-ee
有没有办法在 Java 数据结构上执行 SQL 之类的查询或过滤?
我想通过其中包含的对象的字段过滤 ArrayList 和 HashMap 中的对象。
【问题讨论】:
标签: java sql data-structures collections jakarta-ee
您可能会喜欢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");
【讨论】:
没有标准的类似 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);
}
【讨论】:
是和不是。
不,不是使用类似 SQL 的语法。
是的,使用过滤器函子。具体来说,请查看 Apache Commons Collections、CollectionsUtils.filter() 函数,该函数将 Predicate 对象应用于 Collection。
您编写谓词,Apache 类负责其余的工作。
【讨论】:
规范的方法是迭代数据结构并将所需的对象插入到新的对象中。不幸的是,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"] 打印到标准输出。
【讨论】:
有许多利用 XPath 或 XQuery 的解决方案。对于初学者来说,看看Jaxen。
【讨论】:
一个相当极端的解决方案可能是使用某种 ORM 将您的 Java 对象映射到实际的 SQL 数据库,然后使用实际的 SQL 或类似 SQL 的语言(如 Hibernate 的 HQL)来精确地查询您的对象。 .
当然,如果我真的打算将对象持久化到数据库中,我只会认真考虑这一点,否则就太过分了。
【讨论】: