是否有任何java库可以将访问者函数应用于预泛型集合的多个元素?

是否有任何java库可以将访问者函数应用于预泛型集合的多个元素?,java,xpath,collections,Java,Xpath,Collections,我处理了很多预泛型,比如以字符串作为键的映射。它们将键映射到以下类型的值之一: 另一张地图 单子 原语包装器 您可以使用XPath或类似的查询访问集合内容: myMap/FIRST_LIST[2]/SECOND_LIST[1]/MY_MAP/MY_PRIMITIVE 我正在寻找的是一个库,它允许我将访问者函数应用于集合的多个元素。基本功能可能是这样的 MyMapBrowser browser = new MyMapBrowser(myMap); browser.applyVisitor("

我处理了很多预泛型,比如以字符串作为键的映射。它们将键映射到以下类型的值之一:

  • 另一张地图
  • 单子
  • 原语包装器
您可以使用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
    }
});
MyMapBrowser browser=新的MyMapBrowser(myMap);
browser.applyVisitor(“第一个\u列表[*]/第二个\u列表[*]/我的\u映射/我的\u原语”,
新抽象访客(){
参观(s){
//用绳子做点什么
}
});
如果能够首先为不同级别的收藏注册多个访问者,然后开始访问迭代,那将是一件非常美妙的事情。它可能是这样的:

browser.registerVisitor(SECOND_LIST, new AbstractVisitor<MyList> { ... )
browser.doVisiting("FIRST_LIST[*]/SECOND_LIST[*]/MY_MAP/MY_PRIMITIVE");
browser.registerVisitor(第二个列表,新的AbstractVisitor{…)
dovisting(“第一个列表[*]/第二个列表[*]/我的地图/我的原语”);
事实上,我已经开始实现这样的浏览器,但我无法摆脱一种印象,那就是我正在重新发明轮子。

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

你研究过了吗?它允许你使用XPath表达式来查询和操作Java对象图。该类允许你迭代值如果您只想提取字符串值,则可以选择所选节点的大小,或者可以使用
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
}
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(尽管我以前也尝试过实现类似XPath的遍历器),但显然您也可以将其配置为自动为特定路径创建对象。我没有看到任何访问者功能,但
迭代
获取值
、和
设置值
应该能够完成相同的任务。您还可以装配一个简单的包装器类来运行查询,通过nodes,并将值传递给您自己的访问者界面。类似于:

// 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
}
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());
    }
}
公共类JXPathVisitBrowser{
私有JXPathContext上下文;
公共JXPathVisitBrowser(对象){
context=JXPathContext.newContext(对象);
}
public void applyVisitor(字符串查询,AbstractVisitor){
迭代器iter=context.iterate(查询);
while(iter.hasNext())
visitor.visit((T)iter.next());
}
}

还有一个非常详细的问题。

我不知道你是什么asking@ControlAltDel我很高兴知道你不清楚的是什么。我处理嵌套集合。在每个级别上,你都可以有一个列表、一个映射或一个基元。我可以使用列表的显式索引查询它们-我只想使用星号或索引范围w当我查询多个列表元素时。此外,我想对找到的元素应用一个函数(如函数编程中的函数)。我不知道为什么有人对此投了反对票。问得好!我没有答案,我想你自己也尝试过谷歌。我不确定你是否会找到一些东西,这对我来说似乎太具体了(特别是嵌套地图的事情)-也许访问者实现可以有所帮助…谢谢你的提示。我已经知道LambdaJ,但我读了更多,我发现了一些关于所谓的您有一个类似于Visitor的转换器。此外,它允许您定义一个匹配器,该匹配器可以根据查询字符串查找元素。然而,转换器需要一个平面集合作为输入-因此多级触发将很困难。此外,所有这些都需要大量编码-我希望可能是基于XPath的sol这将不需要编写我自己的解析器。这正是我所需要的——简洁明了的语法,不会过于复杂。非常感谢!