mangos:
Estoy escribiendo un método simple para imprimir las estadísticas de una serie de resultados de los juegos. Cada juego tiene una lista de resultados en el mismo, los cuales contienen enumeraciones de acuerdo con el resultado de un juego. Mi instructor ha comentado un TODO en mi código:
public static void printStatistics(List<Game> games) {
float win = 0;
float lose = 0;
float draw = 0;
float all = 0;
//TODO: should be implemented /w stream API
for (Game g : games) {
for (Outcome o : g.getOutcomes()) {
if (o.equals(Outcome.WIN)) {
win++;
all++;
} else if (o.equals(Outcome.LOSE)) {
lose++;
all++;
} else {
draw++;
all++;
}
}
}
DecimalFormat statFormat = new DecimalFormat("##.##");
System.out.println("Statistics: The team won: " + statFormat.format(win * 100 / all) + " %, lost " + statFormat.format(lose * 100 / all)
+ " %, draw: " + statFormat.format(draw * 100 / all) + " %");
}
Estoy familiarizado con las expresiones lambda. He intentado buscar en línea para las soluciones, pero no pude encontrar ejemplos de una corriente acceder a los campos de un campo de una clase. Yo sería feliz si usted me podría dar una solución, o proveer de mí un tutorial correspondiente. Gracias.
Ruslan:
groupingBy
encaja este caso:
Map<Outcome, Long> map = games.stream()
.flatMap(game -> game.getOutcomes().stream())
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Y obtener win
, lose
contar:
long win = map.get(Outcomes.WIN);
long lose = map.get(Outcomes.LOSE);
...
Para conseguir all
contar necesita sumar todos los valores del mapa
long all = map.values().stream()
.mapToLong(Long::valueOf)
.sum();