从嵌套列表中获取最大值并使用流转换为一个列表
联赛有20人Team,球队有11人Player,球员有int score场地。
class Player {
private int score;
public int getScore() {
return score;
}
}
class Team {
private List<Player> players;
public List<Player> getPlayers() {
return players;
}
}
class League {
private List<Team> teams;
public List<Team> getTeams() {
return teams;
}
}
需要从List<Team> 最好的Player和最高的中进行选择,score并使用 StreamList<Player>从每个团队中返回一个包括一名最好的球员。
public List<Player> getTopPlayersFromEachTeam(List<Team> league) {
// implementation
}
卡在:
league.stream().map(Team::getPlayers).collect(Collectors.toList())
任何提示?
回答
该Team班可以有一个bestPlayer方法
public Player bestPlayer() {
return players.stream().max(Comparator.comparing(Player::getScore)).orElseThrow();
}
在 中League,很容易获得每支球队的最佳球员:
public List<Player> getTopPlayersFromEachTeam() {
return this.teams.stream().map(Team::bestPlayer).collect(Collectors.toList());
}
或多合一
public List<Player> getTopPlayersFromEachTeam() {
return this.teams.stream()
.map(t -> t.getPlayers().stream().max(Comparator.comparing(Player::getScore)).orElseThrow())
.collect(Collectors.toList());
}
该.orElseThrow()代码只是意味着,如果没有max球员可以发现,例如,如果一个球员名单Team是空的
测试代码
League l = new League(Arrays.asList(
new Team(Arrays.asList(new Player(1), new Player(2), new Player(3))),
new Team(Arrays.asList(new Player(10), new Player(20), new Player(30))),
new Team(Arrays.asList(new Player(100), new Player(200), new Player(300)))
));
System.out.println(l.getTopPlayersFromEachTeam()); // [Player{score=3}, Player{score=30}, Player{score=300}]