首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在字符串模板中迭代java列表?

如何在字符串模板中迭代java列表?
EN

Stack Overflow用户
提问于 2013-08-26 13:08:23
回答 1查看 13.5K关注 0票数 17

我想在字符串模板中迭代hibernate查询结果。我一直在找例子,但什么也找不到。

你能帮帮忙吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-17 06:05:27

语法看起来像这样

代码语言:javascript
复制
<items :{ item | <item> }>

用Java把它们放在一起:

代码语言:javascript
复制
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列表中的每个团队。将打印的结果为:

代码语言:javascript
复制
Cats Birds Turtles 

我们可以探索实现这一点的语法。在此之前,请记住,StringTemplate中的默认分隔符小于<且大于>。因为我们没有指定不同的分隔符,所以我们将在示例中使用< >See more about delimiters

代码语言:javascript
复制
:{ }

这组符号、冒号:和左、右括号{}可以理解为"for each“。在示例模板中,代码为,对于teams print team中的每个team。垂直管道|的左侧表示将为每次迭代创建的变量。它将保存团队列表中的当前团队。打印机由竖管|右侧的<team>和闭合支架}的左侧组成。位于垂直管道|右侧且在关闭基础}之前的任何内容都将被评估为打印。

代码语言:javascript
复制
:{ current value | everything in here will be printed }

为了构建这个概念,让我们使用更复杂的数据结构。

代码语言:javascript
复制
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; }
}

现在我们可以为我们的团队创建几个球员:

代码语言:javascript
复制
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());

给出的结果是

代码语言:javascript
复制
Bill is 29
Steve is 30
Toby is 15

有几件事需要注意。我们没有直接访问属性age和name。ST称这些方法为getAge和getName。ST并不关注属性。取而代之的是,它寻找访问方法。

如果我们只想遍历一个包含另一个列表的列表,该怎么办?我们也可以这样做。首先,让我们构建我们的数据结构,并用几个列表填充它。

代码语言:javascript
复制
List<List<String>> listOfLists = asList(
    asList("One", "Two", "Three"), 
    asList("Four", "Five"), 
    asList("Six", "Seven", "Eight", "Nine")
);

该模板将如下所示。

代码语言:javascript
复制
<list :{ items |<items :{ item |<item> }><\n>}>

在本例中,我们的模板将只是一个组合。外壳将遍历我们将提交的列表。

代码语言:javascript
复制
 <list :{ items |  what we will print   }>

然后,对于每个项目,我们将打印出其列表中的项目。

代码语言:javascript
复制
<items :{ item |<item> }>

一旦我们把它们放在一起

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

我们得到的结果如下所示。

代码语言:javascript
复制
One Two Three 
Four Five 
Six Seven Eight Nine 

在这个概念的基础上,我们可以创建包含玩家列表的第二个数据结构。这将演示如何在迭代中迭代。

我们需要的第一件事是一个包含列表的数据结构。为此,我们可以创建一个团队,让我们的球员成为其中的一部分。

代码语言:javascript
复制
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;
    }
}

请注意,我们的团队包含球员。这个组合将允许我们构建两个迭代。

现在我们有了我们的数据结构,让我们把所有的东西都放在一起,组成几个有一些球员的团队。

代码语言:javascript
复制
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)
        ))
);

现在,让我们创建一个模板并填充一些细节:

代码语言:javascript
复制
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());

这将打印出来

代码语言:javascript
复制
Billings has 3 players
Laurel has 4 players

我们的简单模板与上面的第一个模板大致相同。唯一真正的区别是我们使用的是ST length()提供的内置方法。See more on functions here

让我们在第二次迭代中增加一点模板的复杂性。

首先,我们将创建我们的playersTemplate。这与上面的playerTemplate模板几乎完全相同。唯一不同的是,我们的播放器来自teamteam.players

代码语言:javascript
复制
String playersTemplate = "<team.players :{ player |<player.name> is <player.age><\\n>}>";

现在我们将构造包含第一个模板的第二个模板。在这个模板中,我们可以迭代球队,对于每个球队,我们将打印出name,球员数量length(team.players),以及playersTemplate中的所有内容。

代码语言:javascript
复制
String teamTemplate = "<teams:{ team |<team.name> has <length(team.players)> players<\\n>"+playersTemplate+"}>"; 

现在让我们把所有这些放在一起。

代码语言:javascript
复制
ST teamsTemplate = new ST( simpleTeamTemplate);
teamsTemplate.add("teams", teams);

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

这将为我们打印以下内容。

代码语言:javascript
复制
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提供的工具可以使这种局部模板组合变得非常容易。如果你对组合模板感兴趣,你可以找到更多的here

票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18437005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档