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條經驗 獲得超6個贊
如果您需要計算已完成和未完成的游戲,那么另一個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())));
添加回答
舉報