【问题标题】:Querying Java Data Structures查询 Java 数据结构
【发布时间】:2009-04-10 02:48:55
【问题描述】:

有没有办法在 Java 数据结构上执行 SQL 之类的查询或过滤?

我想通过其中包含的对象的字段过滤 ArrayList 和 HashMap 中的对象。

【问题讨论】:

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


    【解决方案1】:

    您可能会喜欢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");
    

    【讨论】:

      【解决方案2】:

      没有标准的类似 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);
       }
      

      【讨论】:

        【解决方案3】:

        是和不是。

        不,不是使用类似 SQL 的语法。

        是的,使用过滤器函子。具体来说,请查看 Apache Commons Collections、CollectionsUtils.filter() 函数,该函数将 Predicate 对象应用于 Collection。

        您编写谓词,Apache 类负责其余的工作。

        【讨论】:

          【解决方案4】:

          规范的方法是迭代数据结构并将所需的对象插入到新的对象中。不幸的是,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"] 打印到标准输出。

          【讨论】:

            【解决方案5】:

            有许多利用 XPath 或 XQuery 的解决方案。对于初学者来说,看看Jaxen

            【讨论】:

              【解决方案6】:

              一个相当极端的解决方案可能是使用某种 ORM 将您的 Java 对象映射到实际的 SQL 数据库,然后使用实际的 SQL 或类似 SQL 的语言(如 Hibernate 的 HQL)来精确地查询您的对象。 .

              当然,如果我真的打算将对象持久化到数据库中,我只会认真考虑这一点,否则就太过分了。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-02-01
                • 2015-05-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-08-02
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多