17

stringtemplate 内で休止状態のクエリ結果を反復処理したいと考えています。例を探していますが、何も見つかりません。

助けていただけますか?ありがとう

4

2 に答える 2

36

構文は次のようになります

<items :{ item | <item> }>

Java でまとめると、次のようになります。

List<String> teams = Arrays.asList("Cats", "Birds", "Turtles");
ST s = new ST( "<teams :{team | <team> }>");
s.add("teams", teams);
System.out.println(s.render());

この例では、リストを繰り返し処理し、リスト内の各チームを出力しteamsます。印刷される結果は次のとおりです。

Cats Birds Turtles 

これを実現する構文を調べることができます。その前に、StringTemplate のデフォルトの区切り文字がより小さいこと<とより大きいことを思い出してください>。別の区切り文字を指定しなかった < >ため、この例で使用するものになります。区切り記号について詳しく見る

:{ }

この一連の記号、コロン:、開き括弧と閉じ括弧{}は、「for each」と読むことができます。テンプレートの例では、コードは for each teamin teamsprintを読み取りますteam。垂直パイプの左側は、|反復ごとに作成される変数を示します。チームのリストから現在のチームを保持します。版画 は<team>縦 パイプ の 右側|と 閉じ 括弧 の 左側で 構成 さ れ て い る}。垂直パイプの右側にあり|、閉じたベースの前にある}ものはすべて、印刷されるように評価されます。

:{ current value | everything in here will be printed }

概念を構築するために、より複雑なデータ構造を使用してみましょう。

public class Player {
    private String name;
    private int age;

    public Person(String name, int age) { 
        this.name = name; 
        this.age = age; 
    }
    public int getAge() { return age; }
    public String getName() { return name; }
}

これで、チームにいくつかのプレーヤーを作成できます。

Player[] players = new Player[] {
    new Player("Bill", 29),
    new Player("Steve", 30),
    new Player("Toby", 15)
};

String playerTemplate = "<players:{ player |<player.name> is <player.age> <\\n>}>"
ST s = new ST( playerTemplate  );
s.add("players", Arrays.asList(players));
System.out.println(s.render());

の結果を与える

Bill is 29
Steve is 30
Toby is 15

注意すべきことがいくつかあります。プロパティ age と name に直接アクセスしませんでした。ST はメソッド getAge および getName を呼び出しました。ST はプロパティを参照しません。代わりに、アクセス方法を見つけようとします。

別のリストを含むリストを繰り返し処理したい場合はどうでしょう。私たちもそれを行うことができます。まず、データ構造を構築し、いくつかのリストで埋めましょう。

List<List<String>> listOfLists = asList(
    asList("One", "Two", "Three"), 
    asList("Four", "Five"), 
    asList("Six", "Seven", "Eight", "Nine")
);

テンプレートは次のようになります。

<list :{ items |<items :{ item |<item> }><\n>}>

この場合のテンプレートは単なる組み合わせになります。外側のシェルは、渡されるリストを繰り返し処理します。

 <list :{ items |  what we will print   }>

次に、各アイテムについて、リスト内のアイテムを出力します。

<items :{ item |<item> }>

すべてをまとめたら

String template = "<list :{ items |<items :{ item |<item> }><\\n>}>";
ST st = new ST( template);
st.add("list", listOfLists);
System.out.println(st.render());

次のような結果が得られます。

One Two Three 
Four Five 
Six Seven Eight Nine 

この概念をさらに発展させて、プレイヤーのリストを含む 2 番目のデータ構造を作成できます。これは、反復内で反復する方法を示します。

最初に必要なのは、リストを含むデータ構造です。このために、プレイヤーが参加するチームを作成できます。

public class Team {
    private List<Player> players;
    private String name;

    public Team (String name, List<Player> players) {
        this.players = players;
        this.name = name;
    }

    public List<Player> getPlayers() {
        return players;
    }

    public String getName() {
        return name;
    }
}

私たちのチームにはプレイヤーが含まれていることに注意してください。この構成により、2 つの反復を構築できます。

データ構造ができたので、すべてを一緒に設定して、何人かのプレーヤーでいくつかのチームを作りましょう。

List<Team> teams = asList(
        new Team("Billings", asList(
                new Player("Bill", 29),
                new Player("Steve", 30),
                new Player("Toby", 15)
        )),
        new Team("Laurel", asList(
                new Player("Chad", 32),
                new Player("Chuck", 29),
                new Player("Will", 24),
                new Player("Ben", 26)
        ))
);

テンプレートを作成し、いくつかの詳細を入力します。

String simpleTeamTemplate = "<teams:{ team |<team.name> has <length(team.players)> players<\\n>}>";

ST template = new ST( simpleTeamTemplate );
template.add("teams", teams);

System.out.println(template.render());

それは印刷されます

Billings has 3 players
Laurel has 4 players

この単純なテンプレートは、上記の最初のテンプレートとほぼ同じです。唯一の実際の違いは、ST が提供する組み込みメソッドを使用していることlength()です。関数の詳細はこちら

2 回目の反復で追加するために、テンプレートの複雑さを少し増やしてみましょう。

まず、 を作成しますplayersTemplateplayerTemplateこれは、上記のテンプレートとほぼ同じです。唯一の違いは、プレイヤーが : から来ていることteamですteam.players

String playersTemplate = "<team.players :{ player |<player.name> is <player.age><\\n>}>";

次に、最初のテンプレートを含む 2 番目のテンプレートを作成します。このテンプレートでは、チームを繰り返し処理し、チームごとにname、プレーヤーの数length(team.players)、および 内のすべてを出力しplayersTemplateます。

String teamTemplate = "<teams:{ team |<team.name> has <length(team.players)> players<\\n>"+playersTemplate+"}>"; 

それでは、すべてをまとめてみましょう。

ST teamsTemplate = new ST( simpleTeamTemplate);
teamsTemplate.add("teams", teams);

System.out.println(teamsTemplate.render());

これにより、次のように出力されます。

Billings has 3 players
Bill is 29
Steve is 30
Toby is 15
Laurel has 4 players
Chad is 32
Chuck is 29
Will is 24
Ben is 26

さて、このようにテンプレートを組み合わせたいとは思わないでしょう。テンプレートを作成するために文字列を追加するのは、かなりばかげています。StringTemplate は、この部分テンプレートの組み合わせを非常に簡単にするツールを提供します。テンプレートの組み合わせに興味がある場合は、こちらで詳細を確認できます

于 2014-01-16T22:05:26.813 に答える