gpt4 book ai didi

java - 如何遍历stringtemplate中的Java列表?

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:48 25 4
gpt4 key购买 nike

我想遍历stringtemplate中的 hibernate 查询结果。我一直在寻找示例,但找不到任何东西。

你能帮忙吗?谢谢

最佳答案

语法看起来像

<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中的默认定界符小于 <并大于 >。由于我们没有指定其他定界符,因此 < >将成为我们在示例中使用的分隔符。 See more about delimiters
:{ }

这组符号,冒号 :以及开括号和闭括号 {}可以读为“for each”。在示例模板中,该代码针对 team print teams中的每个 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>}>

在这种情况下,我们的模板将只是一个组合。 shell 将遍历我们将提交的列表。
 <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

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

我们需要的第一件事是包含列表的数据结构。为此,我们可以创建一个团队供玩家参与。
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;
}
}

请注意,我们的团队中有球员。这种组合将使我们能够建立两个迭代。

现在我们有了数据结构,可以将所有内容放在一起,组成几个球员组成的团队。
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()提供的内置方法。 See more on functions here

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

首先,我们将创建 playersTemplate。这几乎与我们上面的 playerTemplate模板相同。唯一的区别是我们的玩家来自 team: team.players
String playersTemplate = "<team.players :{ player |<player.name> is <player.age><\\n>}>";

现在,我们将构建包含第一个模板的第二个模板。在此模板中,我们可以遍历各个团队,并且对于每个团队,我们将打印出 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提供了一些工具,可以使部分模板的组合非常容易。如果您对合并模板感到好奇,可以找到更多 here

关于java - 如何遍历stringtemplate中的Java列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18437005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com