查询Java数据结构

时间:2009-04-10 02:48:56

标签: java sql data-structures collections java-ee

有没有办法在Java数据结构上执行SQL Like Queries或Filtering?

我希望按照包含在

中的对象的字段过滤ArrayList和HashMap中的对象

6 个答案:

答案 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)来精确地查询对象。

当然,我只是认真地考虑,如果我实际上计划在数据库中保留对象,那么否则它就会过度。