4

我处理了很多前泛型,例如以字符串为键的 Maps。他们将键映射到以下类型的值之一:

  • 另一张地图
  • 一个列表
  • 基元包装器

您可以使用XPath或类似的查询来访问集合内容:

myMap/FIRST_LIST[2]/SECOND_LIST[1]/MY_MAP/MY_PRIMITIVE

我正在寻找的是一个库,它允许我将访问者函数应用于集合的多个元素。基本功能可能看起来像这样

MyMapBrowser browser = new MyMapBrowser(myMap);
browser.applyVisitor("FIRST_LIST[*]/SECOND_LIST[*]/MY_MAP/MY_PRIMITIVE", 
  new AbstractVisitor<String>() {
    visit(String s) {
         // do something with the strings
    }
});

如果有可能首先为不同级别的收藏注册多个访问者,然后开始访问迭代,那也是很棒的。它可能看起来像这样:

browser.registerVisitor(SECOND_LIST, new AbstractVisitor<MyList> { ... )
browser.doVisiting("FIRST_LIST[*]/SECOND_LIST[*]/MY_MAP/MY_PRIMITIVE");

事实上,我已经开始实现这样的浏览器,但我无法摆脱我正在重新发明轮子的印象。

4

2 回答 2

2

你看过JXPath吗?它允许您使用 XPath 表达式来查询和操作 Java 对象图。JXPathContext如果您只想提取字符串值,该类允许您迭代选定节点的值,或者您可以使用该方法selectNodes获取 JDOM 包装器。

例如,我认为您的示例查询看起来像:

// untested
JXPathContext context = JXPathContext.newContext(myMap);
Iterator iter = context.iterate("FIRST_LIST/SECOND_LIST/MY_MAP/MY_PRIMITIVE");
while (iter.hasNext()) {
    String str = (String) iter.next();
    // do something with strings
}

不幸的是,我实际上并没有使用过 JXPath(尽管我之前也尝试过实现类似 XPath 的遍历器),但显然您也可以将其配置为自动为特定路径创建对象。我没有看到任何访问者功能,但是iterate,getValuesetValue应该能够完成同样的事情。您还可以构建一个简单的包装类来运行查询、遍历节点并将值传递给您自己的访问者界面。就像是:

public class JXPathVisitBrowser {
    private JXPathContext context;
    public JXPathVisitBrowser(Object object) {
        context = JXPathContext.newContext(object);
    }
    public <T> void applyVisitor(String query, AbstractVisitor<T> visitor) {
        Iterator iter = context.iterate(query);
        while (iter.hasNext())
            visitor.visit((T) iter.next());
    }
}

还有一个非常详细的JXPath 用户指南

于 2012-05-08T16:31:55.063 回答
0

看看LambdaJ。我想这就是你要找的。

于 2012-05-08T13:43:34.297 回答