2 回答

TA贡献1799条经验 获得超9个赞
您可以使用多个groupingBy来获得这个,例如:
Map<String, Map<String, Long>> gameStatuses = games
.stream()
.collect(Collectors.groupingBy(Game::getUserId,
Collectors.groupingBy(Game::getBattleStatus, Collectors.counting())));
System.out.println(gameStatuses);
为此,您需要为Game类添加一个吸气剂battleStatus,例如:
private static class Game {
String userId;
String battleStatus;
public String getUserId() {
return userId;
}
public String getBattleStatus() {
return battleStatus;
}
}
这将为您提供以下输出:
{user-1={STARTED=1, FINISHED=2}, user-2={STARTED=1, FINISHED=2}}
您可以使用嵌套map.get来获取任何用户和任何状态的计数。

TA贡献1993条经验 获得超5个赞
如果您需要计算已完成和未完成的游戏,那么另一个groupingBy可以帮助您:
Function<Game, Boolean> isFinished = game -> "FINISHED".equals(game.battleStatus);
Map<String, Map<Boolean, Long>> groupedGames =
games.stream()
.collect(groupingBy(Game::getUserId,
groupingBy(isFinished, counting())));
或者您可能想自己分组battleStatus:
Map<String, Map<String, Long>> groupedGames =
games.stream()
.collect(groupingBy(Game::getUserId,
groupingBy(game -> game.battleStatus, counting())));
我什至会创建一个吸气剂getBattleStatus(),然后game -> game.battleStatus用方法参考替换Game::getBattleStatus:
Map<String, Map<String, Long>> groupedGames =
games.stream()
.collect(groupingBy(Game::getUserId,
groupingBy(Game::getBattleStatus, counting())));
添加回答
举报