streams multiple groupingby fields example collector java group-by java-8 aggregate-functions

java - multiple - stream join



java 8 groupingBy, registros de filtro para campos superiores a la media (2)

Intentando aprender java 8 Agrupar por país Estoy intentando filtrar los registros (personas) que están por encima de la edad promedio (Recopilación) devolviendo una lista de personas que cumplen con este criterio.

Entonces el equivalente SQL es

SELECT * FROM PERSON, AVG(AGE) AS AVG_AGE GROUPBY COUNTRY WHERE AGE > AVG_AGE

Este es mi intento hasta ahora, que solo me llevó a mitad de camino

personStream.collect( Collectors.groupingBy( p -> p.getCountry(), Collectors.averagingInt(p -> p.getAge)))

Hasta ahora, esto solo me devuelve un mapa con el clasificador como la clave y la edad promedio por país como valor.

Chan, Japan, 40 Chong, Japan, 20 Amy, Japan, 37 James, UK, 25 Abby, UK, 15, Jean, France 15 Pierre, France, 50 Average Japanese age = 32.33 Average UK age = 20 Average French age = 32.5 ResultSet Chan, Japan, 40 Chong, Japan, 20 Amy, Japan, 37 James, UK, 25 Pierre, France, 50

Cualquier consejo sería apreciado


Creo que es posible que necesite filtrar (p -> p.getAge ()> averageAge) de alguna manera recolectando ese promedio de ese mapa que está obteniendo ahora.


No podrás hacer eso en una sola pasada. Se necesitan 2 pases: el primero para calcular el promedio y el segundo para filtrar las personas que tienen una edad superior a la media.

Tenga en cuenta que la consulta SQL que escribió no funcionará por la misma razón : no puede hacer referencia a un alias de columna dentro de una cláusula WHERE.

Su código calcula correctamente la edad promedio de las personas que viven en el mismo país. Por lo tanto, necesitamos agregar el código que filtra la lista de persons iniciales.

Map<String, Double> map = persons.stream().collect( groupingBy( p -> p.getCountry(), averagingInt(p -> p.getAge()) ) ); persons.stream().filter(p -> p.getAge() > map.get(p.getCountry())).collect(toList());