4

私は、キーとして文字列を使用するマップのようなプレジェネリックをよく扱います。これらは、キーを次のタイプの値のいずれかにマッピングしています。

  • 別の地図
  • リスト
  • プリミティブラッパー

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 のようなトラバーサーを実装してみました) が、特定のパスのオブジェクトを自動的に作成するように構成することもできるようです。ビジター機能は見当たりませんでしたが、iterategetValue、およびsetValueは同じことを達成できるはずです。簡単なラッパー クラスを作成して、クエリを実行し、ノードを反復処理して、値を独自のビジター インターフェイスに渡すこともできます。何かのようなもの:

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 に答える