kit:
Tengo más adelante objetos de clase en un ArrayList:
new Pojo("Football","M",1000)
new Pojo("Football","M",1000)
new Pojo("Cricket","F",500)
new Pojo("Cricket","F",1500)
new Pojo("Cricket","M",500)
new Pojo("Cricket","M",500)
Quiero llegar a los puntos medios de los "Deportes" con respecto al "género". Me encontré con Java 8 arroyos y parece que es bueno para usarlo aquí, pero no sé para ponerlo en práctica.
Lo he probado, como a continuación:
Map<Object,Long> mp = pojoList.stream().collect(Collectors.groupingBy(p -> p.sport,Collectors.counting()));
Es bueno trabajar, y me da un deporte contar pero quiero aplicar uno más filtros de género y conseguir el punto medio.
La salida que quiero:
new PojoOutput("Football","M",1000)
new PojoOutput("Cricket","F",1000)
new PojoOutput("Cricket","M",500)
ernest_k:
Se pueden agrupar en un mapa utilizando 2 groupingBy
llamadas, uno de ellos es el de aguas abajo a la otra:
Map<String, Map<String, Double>> res = pojos.stream()
.collect(Collectors.groupingBy(Pojo::getSport,
Collectors.groupingBy(Pojo::getGender,
Collectors.averagingDouble(i -> i.getPoints()))));
Esto resulta en {Cricket={F=1000.0, M=500.0}, Football={M=1000.0}}
que se puede convertir fácilmente a Pojo
instancias utilizando algo como esto:
List<Pojo> groups = result.entrySet()
.stream()
.flatMap(sport -> sport.getValue()
.entrySet().stream()
.map(gender -> new Pojo(sport.getKey(),
gender.getKey(),
gender.getValue())))
.collect(Collectors.toList());
Resultado con un generada toString
:
[Pojo [sport=Cricket, gender=F, points=1000.0],
Pojo [sport=Cricket, gender=M, points=500.0],
Pojo [sport=Football, gender=M, points=1000.0]]